成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python全棧之路系列之函數(shù)

guyan0319 / 1728人閱讀

摘要:指定參數(shù)即在用戶調(diào)用函數(shù)的時候不需要按照函數(shù)中參數(shù)的位置中所填寫,指定參數(shù)是需要制定參數(shù)對應(yīng)的值。默認(rèn)參數(shù)可以寫在定義參數(shù)的后面,如果用戶調(diào)用函數(shù)是沒有制定參數(shù),那么就會用默認(rèn)參數(shù),如果用戶指定了參數(shù),那么用戶指定的參數(shù)就會代替默認(rèn)參數(shù)。

函數(shù)

函數(shù)是Python為了代碼最大程度的重用和最小化代碼冗余而提供的最基本的程序結(jié)構(gòu)。

函數(shù)式:將某功能代碼封裝到函數(shù)中,日后便無需重復(fù)編寫,僅調(diào)用函數(shù)即可

面向?qū)ο螅簩瘮?shù)進(jìn)行分類和封裝,讓開發(fā)“更快更好更強(qiáng)...”

函數(shù)式編程最重要的是增強(qiáng)代碼的重用性和可讀性

創(chuàng)建的函數(shù)語法

def 函數(shù)名(參數(shù)):
    ...
    函數(shù)體
    ...
    返回值

簡單的實例

# x為函數(shù)的參數(shù)
>>> def num(x):
...  print(x)
...
# 123456等于x
>>> num("123456")
123456
函數(shù)的返回值

函數(shù)的返回值需要使用到return這個關(guān)鍵字,返回值主要是用來接受函數(shù)的執(zhí)行結(jié)果

>>> def re():
...   if 1==1:
...     return True
...   else:
...     return False
...
>>> re()
True

函數(shù)return后面是什么值,re就返回什么值,如果沒有指定return返回值,那么會返回一個默認(rèn)的參數(shù)None

在函數(shù)中,當(dāng)return執(zhí)行完成之后,return后面的代碼是不會被執(zhí)行的

>>> def ret():
...  print("123")
...  return True
...  print("abc")
...
>>> ret()
123
True
位置參數(shù)

傳入?yún)?shù)的值是按照順序依次賦值過去的。

代碼

# x==形式參數(shù),形式參數(shù)有幾個,那么實際參數(shù)就要傳幾個,默認(rèn)參數(shù)除外
def ret(x):
    print(x)
# "Hello Word"實際參數(shù)
print(ret("Hello Word"))

執(zhí)行結(jié)果

Hello Word

如圖所示:

ret小括號內(nèi)的值會被傳入到函數(shù)ret里面都能做x的值,結(jié)果差不多就是print("Hello Word")

函數(shù)的普通參數(shù)實例:發(fā)送郵件
def email(mail):
    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddr

    msg = MIMEText("郵件內(nèi)容", "plain", "utf-8")
    msg["From"] = formataddr(["測試","[email protected]"])
    msg["To"] = formataddr(["走人","[email protected]"])
    msg["Subject"] = "主題"

    server = smtplib.SMTP("smtp.126.com", 25)
    server.login("[email protected]", "123456")
    server.sendmail("[email protected]", [mail,], msg.as_string())
    server.quit()

email("[email protected]")

當(dāng)執(zhí)行這個腳本的時候會給郵箱[email protected]發(fā)送郵件。

注:上面的郵箱地址等都是隨便寫的,請自行更改

指定參數(shù)
>>> def ret(a,b,c):
...  print(a,"a")
...  print(b,"b")
...  print(c,"c")
...
>>> ret(b="bbb",a="aaa",c="ccc")
aaa a
bbb b
ccc c

默認(rèn)情況在再函數(shù)ret括號內(nèi)如果要輸入函數(shù)參數(shù)的值,是要按照順序來的,但是如果在ret括號內(nèi)制定的參數(shù)的值,那么就不需要按照順序來了。

默認(rèn)參數(shù)

如果我們在創(chuàng)建函數(shù)的時候給函數(shù)定義了值,那么在調(diào)用函數(shù)的時候如果不填寫值程序就會報錯:

>>> def ret(x):
...  print(x)
...
>>> ret()
Traceback (most recent call last):
  File "", line 1, in 
TypeError: ret() missing 1 required positional argument: "x"

如果要解決這個問題就可以給函數(shù)的值指定一個默認(rèn)值,指定函數(shù)的默認(rèn)值需要在def這一行指定,制定之后,當(dāng)調(diào)用這個函數(shù)的時候就不需要輸入函數(shù)值了。

>>> def ret(x="Hello Word"):
...  print(x)
...
>>> ret()
Hello Word
# 如果值指定默認(rèn)值,那么實際參數(shù)替換掉形式參數(shù)
>>> ret("Pythoner")
Pythoner

如果給函數(shù)創(chuàng)建了默認(rèn)值,那么有默認(rèn)值的這個參數(shù)必須在最后面定義,不能夠在沒有默認(rèn)參數(shù)的值的前面。

動態(tài)參數(shù)

動態(tài)參數(shù)把接收過來的實際參數(shù)當(dāng)作一個元組,每一個參數(shù)都是元組中的一個元素。

第一種動態(tài)參數(shù)

定義第一種動態(tài)參數(shù)需要在參數(shù)前面加上一個*

>>> def ret(*args):
...  print(args,type(args))
...
>>> ret(11,22,33)
(11, 22, 33) 

第二種動態(tài)參數(shù)

定義第二種動態(tài)參數(shù)需要在參數(shù)前面加上兩個*號,給參數(shù)傳參的時候是一個key對應(yīng)一個value的,相當(dāng)于一個字典的鍵值對,而且返回的類型就是字典類型。

使用兩個星號可以將參數(shù)收集到一個字典中,參數(shù)的名字是字典的鍵,對應(yīng)參數(shù)的值是字典的值。

>>> def ret(**kwargs):
...  print(kwargs,type(kwargs))
...
>>> ret(k1=123,k2=456)
{"k1": 123, "k2": 456} 

第三種動態(tài)參數(shù)

第三種又稱為萬能的動態(tài)參數(shù),如下實例:

>>> def ret(*args,**kwargs):
...  print(args,type(args))
...  print(kwargs,type(kwargs))
...
>>> ret(11,222,333,k1=111,k2=222)
(11, 222, 333) 
{"k1": 111, "k2": 222} 

字典小例子:

>>> def arg(**kwargs):
...  print(kwargs,type(kwargs))
...
>>> dic = {"k1":123,"k2":456}
>>> arg(k1=dic)
{"k1": {"k1": 123, "k2": 456}} 
>>> arg(**dic)
{"k1": 123, "k2": 456} 
避免可變參數(shù)的修改

如果不想在函數(shù)內(nèi)部修改參數(shù)值而影響到外部對象的值,我們可以使用切片的方式進(jìn)行參數(shù)的傳遞:

#!/use/bin/env python

L = ["a", "b"]
def changer(L):
    L[0] = 0
print(L)
changer(L)
"""
["a", "b"]
[0, "b"]
"""
# changer(L[:])
"""
["a", "b"]
["a", "b"]
"""
print(L)
參數(shù)解包
In [2]: def f(a, b, c, d): print(a, b, c, d)

In [3]: args = (1, 2)

In [4]: args += (3, 4)

In [5]: f(*args)
1 2 3 4

又或者使用

def f(a, b, c, d): print(a, b, c, d)
args = {"a": 1, "b": 2, "c": 3, "d": 4}
f(**args)
參數(shù)書寫位置

在函數(shù)調(diào)用中: 位置參數(shù) --》 關(guān)鍵字參數(shù) --》元組形式--》字典形式
在函數(shù)頭部: 一般參數(shù)--》默認(rèn)參數(shù)--》元組形式--》字典形式

def func(name, age=None, *args, **kwargs):
    print(name, age, args, kwargs)

func("ansheng", 18, *(1, 2, 3), **{"blog": "blog.ansheng.me"})
全局變量和局部變量

簡單的理解全局變量和變量,全局變量可以理解為在當(dāng)前這個文件內(nèi)定義的變量,局部變量則是在函數(shù)內(nèi)定義的變量,如下例:

# qa
# 全局變量
n1 = 1
def num():
    # 局部變量
    n2 = 2
    print(n1)
    print(n2)
num()

輸出的結(jié)果

C:Python35python.exe F:/Python_code/sublime/Day05/def.py
1
2

定義的全局變量都可以在函數(shù)內(nèi)調(diào)用,但是不能再函數(shù)內(nèi)修改,局部變量在也不能夠直接調(diào)用,如果要在函數(shù)內(nèi)修改全局變量,那么就需要用到關(guān)鍵字``

n1 = 1
def num():
    n2 = 2
    global n1
    n1 = 3
    print(n1)
    print(n2)
num()

執(zhí)行結(jié)果

C:Python35python.exe F:/Python_code/sublime/Day05/def.py
3
2
nonlocal語句

nonlocal是用來修改嵌套作用域中的變量,類似于global一樣,只需要在嵌套函數(shù)中聲明變量名即可,但是這個變量名是必須已經(jīng)存在的否則就會報錯,如果要修改的變量在作用域中查找不到,那么不會繼續(xù)到全局或內(nèi)置作用域中查找。

In [1]: def func1(arg1):
   ...:     n = arg1
   ...:     print(n)
   ...:     def func2():
   ...:         nonlocal n
   ...:         n += 1
   ...:     func2()
   ...:     print(n)
   ...:     

In [2]: func1(10)
10
11
Lambda表達(dá)式

Lambda(Lambda expressions)表達(dá)式是用lambda關(guān)鍵字創(chuàng)建的匿名函數(shù),Lambda函數(shù)可以用于任何需要函數(shù)對象的地方,在語法上,它們被局限于只能有一個多帶帶的表達(dá)式。

使用Lambda表達(dá)式創(chuàng)建函數(shù)

>>> f = lambda x,y : x + y
>>> f(1,2)
3

使用def創(chuàng)建函數(shù)

>>> def f(x,y):
...  return x + y
...
>>> f(1,2)
3

對于比較簡單的函數(shù)我們就可以通過lambda來創(chuàng)建,它的的好處是縮短行數(shù)。

lambda創(chuàng)建的函數(shù)和def創(chuàng)建的函數(shù)對應(yīng)關(guān)系如圖所示:

嵌套lambda和作用域
def action(x):
    return (lambda y: x + y)

act = action(99)
print(act)
result = act(2)
print(result)

輸出為:

. at 0x1021e6400>
101

lambda也能夠獲取到任意上層lambda中的變量名:

action = lambda x: (lambda y: x + y)
act = action(99)
print(act)
result = act(3)
print(result)

輸出為:

.. at 0x1029e6400>
102
測試題 第一題

簡述普通參數(shù)、指定參數(shù)、默認(rèn)參數(shù)、動態(tài)參數(shù)的區(qū)別

普通參數(shù)即是用戶在調(diào)用函數(shù)是填入的參數(shù),且參數(shù)位置必須與參數(shù)保持一致。

指定參數(shù)即在用戶調(diào)用函數(shù)的時候不需要按照函數(shù)中參數(shù)的位置中所填寫,指定參數(shù)是需要制定參數(shù)對應(yīng)的值。

默認(rèn)參數(shù)可以寫在定義參數(shù)的后面,如果用戶調(diào)用函數(shù)是沒有制定參數(shù),那么就會用默認(rèn)參數(shù),如果用戶指定了參數(shù),那么用戶指定的參數(shù)就會代替默認(rèn)參數(shù)。

動態(tài)參數(shù)可以接受用戶輸入的任何參數(shù),包括字典、列表、元組等數(shù)據(jù)類型。

第二題

計算傳入字符串中數(shù)字、字母、空格以及其他的個數(shù)

def var(s):
    all_num = 0
    spance_num = 0
    digit_num = 0
    others_num = 0
    for i in s:
        # 檢測數(shù)字
        if i.isdigit():
            digit_num += 1
        # 檢測空格
        elif i.isspace():
            spance_num += 1
        # 檢測字母
        elif i.isalpha():
            all_num += 1
        else:
            # 其他
            others_num += 1
    return ("字母:",all_num,"空格:",spance_num,"數(shù)字",digit_num,"其他字符",others_num)
num = var("21323 asd*%^*^% &*213asdasdasda sdasdasd")
print(num)

執(zhí)行結(jié)果

C:Python35python.exe F:/Python_code/sublime/operation/Day05/c.py
("字母:", 21, "空格:", 3, "數(shù)字", 8, "其他字符", 8)
第三題

寫函數(shù),判斷用戶傳入的對象(字符串、列表、元組)長度是否大于5,如果大于5就返回True,如果小于5就返回False

# 定義一個函數(shù)num
def num(x):
    # 判斷函數(shù)的值如果長度大于5就返回True
    if len(x) > 5:
        return True
    # 否則就返回False
    else:
        return False

ret = num(["asd","asdasd","asdasd","asdasd"])
print(ret)
ret = num("asdasdasd")
print(ret)
第四題

寫函數(shù),檢查用戶傳入的對象(字符串、列表、元組)的每一個元素是否含有空內(nèi)容,如果有空就返回False

# 定義一個函數(shù)num
def num(x):
    # 循環(huán)輸出num內(nèi)的所有內(nèi)容
    for n in x:
        # 數(shù)據(jù)類型轉(zhuǎn)換為字符串
        n = str(n)
        # 如果有空格就返回False
        if n.isspace():
            return False

ret = num(" ")
print(ret)

ret = num("asdasd")
print(ret)

ret = num(["asd","312",123," "])
print(ret)
第五題

寫函數(shù),檢查傳入列表的長度,如果大于2,那么僅保留前兩個長度的內(nèi)容,并將新內(nèi)容返回給調(diào)用者。

def num(x):
    # 如果列表中的長度大于2,那么就輸出列表前兩個內(nèi)容,否則就返回一個空
    if len(x) > 2:
        return x[:2]
    else:
        return ""
print(num(["11","22","33"]))

print(num(["33"]))
第六題

寫函數(shù),檢查獲取傳入列表或元組對象的所有奇數(shù)位索引對應(yīng)的元素,并將其作為新列表返回給調(diào)用者。

def num(x):
    # 定義一個空列表用于接收奇數(shù)位的元素
    resule = []
    # 循環(huán)輸出列表中的所有元素值
    for n in range(len(x)):
        # 如果列表中的位置為奇數(shù)就把值添加到resule列表中
        if n % 2 == 1:
            resule.append(x[n])
    # 然會resule列表中的內(nèi)容
    return resule

ret = num([11,22,33,44,55,66])
print(ret)
第七題

寫函數(shù),檢查傳入字典的每一個value的長度,如果大于2,那么僅保留前兩個長度的內(nèi)容,并將新內(nèi)容返回給調(diào)用者。

dic = {"k1": "v1v1", "k2": [1111,22,33,44]}

PS:字典中的value只能是字符串或列表

代碼

def dictt(x):
    # 循環(huán)字典中所有的key
    for k in x.keys():
        # 如果字典中k對應(yīng)的元素是字符串類型就下面的判斷
        if type(x[k]) == str:
            # 如果元素的長度大于2
            if len(x[k]) > 2:
                # 那么就讓這個元素重新賦值,新的值只保留原來值的前兩個
                x[k]=x[k][0:2]
        # 如果字典中k對應(yīng)的元素類型是列表,就進(jìn)入下面的判斷
        elif type(x[k]) == list:
            # 先把列表中的值全部for循環(huán)
            for i in x[k]:
                # 把元素轉(zhuǎn)換為字符串
                string = str(i)
                # 如果元素的長度大于2
                if len(string) > 2:
                    # 獲取元素的索引值
                    num = x[k].index(i)
                    # 先把這個元素給刪除
                    x[k].pop(x[k].index(i))
                    # 然后再添加一個新的元素,新元素的只保留原來元素的前兩個
                    x[k].insert(num,string[:2])
    # 把結(jié)果return出來
    return dic
ret = dictt(dic)
print(ret)

執(zhí)行結(jié)果

C:Python35python.exe F:/Python_code/sublime/operation/Day05/h.py
{"k1": "v1", "k2": ["11", 22, 33, 44]}

原文鏈接

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/38404.html

相關(guān)文章

  • Python全棧系列遞歸

    摘要:所謂遞歸其實就是函數(shù)本身調(diào)用函數(shù),直到滿足指定條件之后一層層退出函數(shù),例如從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢故事是什么呢從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢故事是什么呢從前有座山,山里有座廟 所謂遞歸其實就是函數(shù)本身調(diào)用函數(shù),直到滿足指定條件之后一層層退出函數(shù), 例如 從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢!故事是...

    kviccn 評論0 收藏0
  • Python全棧系列列表數(shù)據(jù)類型

    摘要:列表同字符串一樣都是有序的,因為他們都可以通過切片和索引進(jìn)行數(shù)據(jù)訪問,且列表的的是可變的。 列表(list)同字符串一樣都是有序的,因為他們都可以通過切片和索引進(jìn)行數(shù)據(jù)訪問,且列表的的是可變的。 創(chuàng)建列表的幾種方法 第一種 name_list = [Python, PHP, JAVA] 第二種 name_list = list([Python, PHP, JAVA]) 創(chuàng)建一個空列表 ...

    ?。?。 評論0 收藏0
  • Python全棧系列文件操作

    摘要:可以對文件進(jìn)行查看創(chuàng)建等功能,可以對文件內(nèi)容進(jìn)行添加修改刪除,且所使用到的函數(shù)在為,在同時支持和,但是在系列移除了函數(shù)。在及以后,又支持同時對多個文件的上下文進(jìn)行管理,即原文鏈接 Python可以對文件進(jìn)行查看、創(chuàng)建等功能,可以對文件內(nèi)容進(jìn)行添加、修改、刪除,且所使用到的函數(shù)在Python3.5.x為open,在Python2.7.x同時支持file和open,但是在3.5.x系列移除...

    Drummor 評論0 收藏0
  • Python全棧系列賦值與運算符

    摘要:在繼續(xù)下面的文章之前我們先來瀏覽一下為我們提供的幾種運算符,定義兩個變量,分別是和,的值是,的值是。 在繼續(xù)下面的文章之前我們先來瀏覽一下Python為我們提供的幾種運算符,定義兩個變量,分別是a和b,a的值是10,b的值是20。 算術(shù)運算符 運算符 描述 實例 + 加,兩個對象相加 a+b=30 - 減,兩個對象相減,可能會得到負(fù)數(shù) a-b=-10 * 乘,兩數(shù)相稱...

    Faremax 評論0 收藏0
  • Python全棧系列元組數(shù)據(jù)類型

    摘要:元組和列表的為唯一區(qū)別就是列表可以更改,元組不可以更改,其他功能與列表一樣創(chuàng)建元組的兩種方法第一種第二種如果元祖內(nèi)只有一個元素,那么需要加上一個逗號,否則就變成字符串了。 元組(tuple)和列表的為唯一區(qū)別就是列表可以更改,元組不可以更改,其他功能與列表一樣 創(chuàng)建元組的兩種方法 第一種 ages = (11, 22, 33, 44, 55) 第二種 ages = tuple((11,...

    李濤 評論0 收藏0
  • Python全棧系列字典數(shù)據(jù)類型

    摘要:字典在基本的數(shù)據(jù)類型中使用頻率也是相當(dāng)高的,而且它的訪問方式是通過鍵來獲取到對應(yīng)的值,當(dāng)然存儲的方式也是鍵值對了,屬于可變類型。 字典(dict)在基本的數(shù)據(jù)類型中使用頻率也是相當(dāng)高的,而且它的訪問方式是通過鍵來獲取到對應(yīng)的值,當(dāng)然存儲的方式也是鍵值對了,屬于可變類型。 創(chuàng)建字典的兩種方式 第一種 >>> dic = {k1:123,k2:456} >>> dic {k1: 123, ...

    caoym 評論0 收藏0

發(fā)表評論

0條評論

guyan0319

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<