pythonⅢ——高級特性

目錄

 

匿名函數

函數引用

列表推導式

引用

可變類型和不可變類型

遞歸函數


匿名函數

"""
    匿名函數:沒有名字的函數,它是 以表達式來    定義的簡單函數
    定義格式:
        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))

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章