一.recode
0.什么是函數(shù)躺屁、什么是需要使用函數(shù)
對實現(xiàn)某一特定功能的代碼段的封裝
1.函數(shù)的聲明
def 函數(shù)名(參數(shù)列表):
"""函數(shù)說明文檔"""
函數(shù)體
2.函數(shù)的調(diào)用
"""
1)語法: 函數(shù)名(實參列表)
2)調(diào)用過程(重點):
回到函數(shù)聲明的位置
讓實參給形參賦值(傳參) - 保證每個參數(shù)都有值
執(zhí)行函數(shù)體
確定返回值 - 看執(zhí)行函數(shù)的時候有沒有遇到return, 遇到了return后面是什么返回值就是什么
沒有遇到就是None
回到函數(shù)調(diào)用的位置宰衙,接著往后面執(zhí)行 - 這個時候函數(shù)調(diào)用表達(dá)式的值才是函數(shù)的返回值
"""
3.函數(shù)參數(shù)
"""
1) 位置參數(shù)和關(guān)鍵字參數(shù)
注意: 兩個同時存在的時候,位置參數(shù)要在關(guān)鍵字參數(shù)的前面
2) 參數(shù)默認(rèn)值
注意:沒有默認(rèn)值的參數(shù)放在前面
3) 參數(shù)類型說明: 給參數(shù)賦默認(rèn)值、形參名:類型
4) 不定長參數(shù)(用的較少)
*參數(shù)名 - 參數(shù)變成元祖鲤桥;給這個參數(shù)賦值只能用位置參數(shù)
**參數(shù)名 - 參數(shù)變成字典逛钻;給這個參數(shù)賦值只能關(guān)鍵字參數(shù)
*args, **kwargs
"""
nums = [1, 2, 3, 90, 4]
nums.sort(reverse=True)
print(nums)
4.返回值
"""
1)怎么確定函數(shù)的返回值 (見函數(shù)調(diào)用過程)
2)怎么獲取函數(shù)的返回值 (通過獲取函數(shù)調(diào)用表達(dá)式的值)
3)聲明函數(shù)的時候长搀,什么時候需要函數(shù)的返回值;把誰作為函數(shù)的返回值 (看實現(xiàn)函數(shù)功能會不會產(chǎn)生新的數(shù)據(jù))
"""
result = sum([1, 23, 4])
def yt_sum(*nums2):
return sum(nums2)
二.lambda
1.什么是匿名函數(shù)
沒有函數(shù)名的函數(shù)就是匿名函數(shù) (匿名函數(shù)還是函數(shù)C峁恪J枞铡!H龊骸!L樽獭)
2.語法
"""
lambda 形參列表: 返回值
說明: lambda - 關(guān)鍵字睬辐,固定寫法
形參列表 - 和普通函數(shù)的形參列表一樣的。變量名1,變量名2..
(參數(shù)相關(guān)的語法中,除了':類型名'對參數(shù)類型進(jìn)行說明以外溯饵,別的語法都適用)
: - 固定寫法
返回值 - 相當(dāng)于普通函數(shù)中return后面的語句
注意: 匿名函數(shù)能做的事情普通函數(shù)都可以做侵俗;但是多行代碼的普通函數(shù),匿名函數(shù)沒法實現(xiàn)
"""
def yt_sum(n1: int, n2):
if n1 < 10:
print('n1')
return n1+n2
lambda n1, n2: n1+n2
3.調(diào)用 (和普通函數(shù)一樣)
函數(shù)(實參列表) --- 函數(shù)不一定是函數(shù)名丰刊,可以是通過任何方式獲取到的類型function的值
python中隘谣,聲明還是其實可以看成是聲明類型是function的變量;匿名函數(shù)可以看成是function類型的數(shù)據(jù)(類似100是int類型的數(shù)據(jù))
變量名 = lambda 參數(shù)列表: 返回值 --- 通過'變量名()'來調(diào)用匿名函數(shù)
a = 100
b = 12.5
c = 'abc' # 類型是str的值
d = [10, 23, 90, 'abc'] # 類型是list的值
e = {'a': 100, 'b': 200} # 類型是dict的值
print(type(e))
print(e['a'])
f = lambda x, y: x*y # 類型是function的值 return x*y
print(type(f))
print(f(10, 20))
print(f(y=30, x=2))
list1 = [100, b, c, d, e, lambda x, y:x+y]
print(list1[0]+200)
print(list1[-1](10, 22))
三.function
1.函數(shù)作為變量(重點W那伞Q捌纭!)
python中聲明函數(shù)其實就是在聲明一個類型是function的變量秩仆,函數(shù)名就是變量名码泛。所以普通變量能做的事情,函數(shù)都能做
聲明一個函數(shù)func1,有一個參數(shù)一個返回值澄耍;func1是類型是function的變量噪珊,它里面存的數(shù)據(jù)是一個函數(shù),函數(shù)名叫func1,有一個參數(shù)n
2.普通變量能做的函數(shù)都能做
1)用一個變量給另外一個變量賦值
list1 = [1, 2]
list2 = list1
print(list2[0])
def fun2(n):
# n = 22
return n*3 # return 22*3
a1 = fun2
print(a1(22))
"""
fun2 = function(), 有一個參數(shù)n
"""
2)變量可以作為列表/元祖的元素齐莲、作為字典的值等
list1 = [1, 2]
dict1 = {'a': list1}
def fun3(n):
return n*2
dict1 = {'a': list1, 'b': fun3}
dict1['a'].append(100)
print(dict1)
print(dict1['b'](9)) # fun3(9)
- 變量作為函數(shù)的實參
將函數(shù)作為實參傳遞給另外一個函數(shù)(實參高階函數(shù)痢站、閉包)
nums = [1, 2, 3]
print(sum(nums))
def fun4(a):
# a = print
a('abc') # print('abc')
print(fun4(print))
應(yīng)用: sort方法的高級使用
列表.sort(key) - key需要傳一個類型是function的值(函數(shù)),要求這個函數(shù)有一個參數(shù)和一個返回值參數(shù)指向的是列表中的每個元素选酗,返回值是排序的時候的比較對象
nums = ['14', '40', '73', '9', '85']
def fn1(x):
return x[0] # 返回值決定列表中的元素按什么進(jìn)行排序
nums.sort(key=fn1)
print(nums) # ['14', '40', '73', '85', '9']
nums.sort(key=lambda item: int(item))
print(nums) # ['9', '14', '40', '73', '85']
students = [
{'name': 'xiaoming', 'age': 23, 'score': 90},
{'name': 'huahu', 'age': 30, 'score': 70},
{'name': 'zhangsan', 'age': 19, 'score': 100},
]
students.sort(key=lambda item: item['age'])
print(students)
students.sort(key=lambda item: item['score'])
print(students)
students.sort(key=lambda item: item['name'][-1])
print(students)
print(max(['10', '30', '8'], key=lambda x: int(x)))
print(max(students, key=lambda x: x['score']))
"""
[20, 34, 8, 9, 70]
[70, 20, 8, 9, 34] index = 0
[70, 34, 8, 9, 20] index = 1
[70, 34, 20, 8, 9] index = 2
[70, 34, 20, 9, 8] index = 3
"""
四.scope
1.作用域: 變量的使用范圍
2.全局變量和局部變量
"""
a.全局變量: python中除了在函數(shù)中或者類中聲明的變量阵难,都是全局變量。
全局變量的作用域:從聲明開始到文件結(jié)束的任何位置都可以使用
b.局部變量: 在函數(shù)中聲明的變量就是局部變量星掰。
從聲明開始到函數(shù)結(jié)束都可以使用
"""
3.global和nonlocal
"""
1) global: 想要在一個函數(shù)中去修改一個全局變量的值多望,或者想要在函數(shù)中聲明一個全局變量
global 變量名
變量名 = 值
2)nonlocal: 想要在局部的局部中修改一個局部變量的值
nonlocal 變量名
變量名 = 值
"""