目錄
匿名函數
"""
匿名函數:沒有名字的函數,它是 以表達式來 定義的簡單函數
定義格式:
lambda 參數1, 參數2:返回值
調用格式:
(lambda 參數1,參數2:返回值)(實參1,實參2)
優點:
匿名函數調用完的內存就會回收;
性能比普通函數要好一些
"""
print((lambda num1, num2: num1 + num2)(1, 2))
"""(lambda 參數1,參數2:返回值)相當於函數名"""
# 匿名函數的應用:
data = filter(lambda num: num % 2 != 0, [1, 2, 3, 4, 5]) # filter(__function, __iterable)
for num in data:
print(num)
list1 = [['zs', 10], ['lisi', 33], ['ww', 8]]
list1.sort(key=lambda arg: arg[1])
print(list1) # [['ww', 8], ['zs', 10], ['lisi', 33]]
函數引用
# 函數名相當於變量名,而且還是一個全局變量,是一個代號,指向了這個函數
def fun():
return '丫頭'
a = fun
print(a()) # 丫頭
print(fun()) # 丫頭
print(a, fun) # <function fun at 0x000001DEA6291048> <function fun at 0x000001DEA6291048>
print('。。。。。。。。。。。。。。求和、求差')
def func_sum(num1, num2):
return num1 + num2
def func_sub(num1, num2):
return num1 - num2
def fun_all(num1, num2, func_arg):
ret = func_arg(num1, num2)
print('運算結果爲:%s' % ret)
fun_all(1, 2, func_sum)
fun_all(1, 2, func_sub)
'''
要求定義函數可以對數據進行過濾,並可以自由指定過濾算法
'''
def func1(num):
return num % 2 == 0
def func2(num):
return num % 2 == 1
def func_filter(*args, func_arg):
return [num for num in args if func_arg(num)]
data = func_filter(1, 2, 3, 4, 5, 8, 6, func_arg=func1)
print(data)
data = func_filter(1, 2, 3, 4, 5, 8, 6, func_arg=func2)
print(data)
print('。。。。。。。。')
'''
引出:內置高階函數filter
python中將函數的參數爲函數引用的函數稱爲高階函數
匿名函數可用於輔助高階函數來使用
'''
data = filter(func1, [1, 2, 3, 4, 8])
for num in data:
print(num, '////////')
data = filter(lambda num: num > 3, [1, 2, 3, 4, 8])
for num in data:
print(num)
# (lambda 參數1,參數2:返回值)(實參1,實參2)
def func_filter(*args):
return [num for num in args if (lambda num: num % 2 == 0)(num)]
print(func_filter(1, 2, 3, 4, 5, 8, 6))
列表推導式
"""
列表推導式:快速生成列表元素的表達式(一行)
格式:[計算公式 for循環]
特點:
1>每循環一次就按照計算公式的結果向列表中添加一個元素;
2>計算公式可以使用for循環遍歷出的數據
"""
list0 = []
for i in range(100):
list0.append(i + 1)
print(list0)
list0 = [i + 1 for i in range(100)]
print(list0)
# 列表中包含1-100的偶數
list1 = [i for i in range(2, 101, 2)]
print(list1)
list1 = [i for i in range(1, 101) if i % 2 == 1]
print(list1)
# 練習
def str_0(list_0):
return [temp for temp in list_0 if len(temp) > 4]
list3 = ['hello', 'boy', 'girl', 'apple', 'python']
print(str_0(list3))
引用
a = 1
b = 2
# id(變量),會返回該變量的引用地址,引用地址和內存地址不一樣,python中獨有的叫法引用地址
# 引用地址相等,就意味着兩個變量指向同一個內存空間
print(id(a), id(b)) # 1556304672 1556304704
b = a
print(id(a), id(b)) # 1556304672 1556304672
print('。。。。。。。')
# 列表中存放的是存數值的地址
a = [10] # a中存的是列表地址
b = a
b.append(20)
print(id(b[0]))
print(id(b[1]))
c = [10, 20] # 值傳遞,會開闢新的內存來保存[10, 20]
print(id(a), id(b), id(c))
print('。。。。。。。')
# python中會對數字和字符串做緩存處理
# 首次記錄數據會開闢新空間保存,再次記錄時先查詢內存中是否已保存過該數據,如果已經保存,則直接使用
a = 10
b = 10
c = 'hello'
d = 'hello'
print(id(a), id(b), id(c), id(d))
'''
python中有一個內存自動回收機制
'''
# python中將變量列表使用字典來存儲 ★
# python不探究底層
執行結果:
1807897376 1807897408
1807897376 1807897376
。。。。。。。
1807897664
1807897984
2120975066440 2120975066440 2120975089224
。。。。。。。
1807897664 1807897664 2120975050768 2120975050768
可變類型和不可變類型
可變類型:數據保存後可以進行修改 列表、字典
不可變類型:數據保存後不可以進行修改 數字、字符串、元組
遞歸函數
"""
遞歸函數:終止遞歸 + 功能操作
階乘公式:(n的階乘) = n * (n-1的階乘)
"""
# 函數調用始終沒有結果,佔用的內存也不會釋放,太佔內存,導致性能比較差,python中對遞歸次數進行了限制,最大1000
def fun(n):
if n == 1:
return 1
return n * fun(n - 1)
print(fun(6))