Python第四天學(xué)習(xí)

python函數(shù)基礎(chǔ)
2019-05-18
--張伯羽


1.變長參數(shù)
  • 一個*: 將參數(shù)都放在一個元組中
def self_print(*a):
    print(a)
    print(type(a))
self_print(1,2,3,4,5,6)
(1, 2, 3, 4, 5, 6)
<class 'tuple'>
  • 兩個*: 將參數(shù)都放在一個字典中
def d_self_print(**kwargs):
    print(kwargs)
d_self_print(last_name='張', first_name='伯羽')
{'last_name': '張', 'first_name': '伯羽'}
  • 形參順序: 位置參數(shù)->元組->字典
def mix(name, *t, **kw):
    print(name)
    print(t)
    print(kw)

mix('張', 20, 'dongqin', gender='男')
張
(20, 'dongqin')
{'gender': '男'}
  • 一個*可以拆開元組和列表
t = (1,2,3,4,5)
print(*t)
def f(*tt):
    print(tt)
f(*[1,2,3,4,5])
1 2 3 4 5
(1, 2, 3, 4, 5)
  • 兩個*可以拆開字典
def ff(**kwargs):
    print(kwargs)
ff(**{'name':'zhang', 'age':20})
{'name': 'zhang', 'age': 20}
  • return 返回值
def sum_and_avg(*numbers):
    total = sum(numbers)
    avg_number = total/len(numbers)
    return total, avg_number
sum, avg = sum_and_avg(1,2,3,4,5,6,7,8,9,10)
print("總和是%f" % sum)
print("平均值是%f" % avg)
2.函數(shù)的傳參問題

數(shù)據(jù)分為引用類型, 普通類型
python中的基本數(shù)據(jù)類型都是普通類型,數(shù),布爾型,字符串型
除此之外類型都是引用類型
普通類型賦值時傳的是值,引用類型賦值時傳的是地址

l1 = [1,2,3,4,5]
l2 = l1
# 指向同一塊內(nèi)存
l2[1] = 5
print(l1)
[1, 5, 3, 4, 5]

傳參的本質(zhì)是賦值操作,如果傳遞的是引用類型數(shù)據(jù),則需要注意是否在函數(shù)中對其做出了修改

  • 可以用numbers[:]復(fù)制
def power(numbers):
    # numbers = {x**2 for x in numbers}
    numbers = numbers[:]
    # 復(fù)制一份
    numbers = list(numbers)
    #復(fù)制一份
    numbers[3] = 10
    return numbers

nums = [1,2,3,4,5,6]
print(power(nums))
print(nums)
[1, 2, 3, 10, 5, 6]
[1, 2, 3, 4, 5, 6]
3.函數(shù)的閉包
  • 函數(shù)名本質(zhì)代表的是函數(shù)的地址
def fun():
    print('Hello World!')
fx = fun()
fx
Hello World!
  1. 內(nèi)層函數(shù)可以訪問外層函數(shù)的變量,但不能修改
  2. 內(nèi)層函數(shù)訪問變量時會先從自己查找,如果找不到,就會層層向上查找
  3. python中變量的作用域是以函數(shù)為單位的
  4. global修飾變量時,說明使用的是最外層的全局變量
  5. nolocal修飾變量時,說明使用的是嵌套層函數(shù)的變量
    閉包的本質(zhì)是函數(shù)嵌套函數(shù),外層函數(shù)返回內(nèi)層函數(shù)的地址
aa = 10
def outter():
    aa = 10
    def inner():
        # 說明使用的是外全局變量
        # global a
        nonlocal aa
        aa -= 1
        print(aa)
        print('hello inner')

    return inner
fo = outter()
fo()
fo()
fo()
9
hello inner
8
hello inner
7
hello inner
4.遞歸

函數(shù)自己調(diào)用自己,編寫遞歸或循環(huán)一般先考慮出口(結(jié)束的條件)問題

  • 求階乘的問題
def factorial(n):
    res = 1
    for num in range(1, n+1):
        res *= num
    return res

print(factorial(5))
120
  • 斐波那契數(shù)列
    1.遞歸
# 遞歸
def feibonaqi2(n):
    if n==1 or n==2:
        return 1
    else:
        return feibonaqi2(n-1) + feibonaqi2(n-2)
list = []
for i in range(1, num+1):
    list.append(feibonaqi2(i))
print(list)
[1, 1, 2, 3, 5]

2.循環(huán)

# 使用for循環(huán)
def feibonaqi3(n):
    before = 0
    after = 1
    if n==1:
        return 1
    for i in range(2, n+1):
        tmp = before + after
        # before = after
        # after = tmp
        before, after = after, tmp
    return tmp
list2 = []
for i in range(1, num+1):
    list2.append(feibonaqi3(i))
print(list2)
[1, 1, 2, 3, 5]
  • 高階函數(shù),參數(shù)或返回值是函數(shù)的函數(shù)
  1. 累加
def handle(func, *param):
    return func(*param)
def my_sum(*param):
    sum = 0
    for i in range(len(param)):
        sum += param[i]
    return sum
print(my_sum(1,2,3,4,5))

# 函數(shù)的參數(shù)還是一個函數(shù)
print(handle(my_sum, 1, 2, 3, 4, 5))
15
15
  1. 累乘
print(handle(my_sum, 1, 2, 3, 4, 5))
def my_mul(*param):
    """
    累乘
    :param param:
    :return:
    """
    mul = 1
    for v in param:
        mul *= v

    return mul
print(handle(my_mul, 1,2,3,4,5))
120
  • map(func,inteable)

該函數(shù)會把inteable中的數(shù)據(jù)依次傳遞給func函數(shù)處理,最后把處理的結(jié)果返回

# [1,2,3,4,5]->[1,4,9,16,25]
def power(x):
    return x * x
# result = map(power, [1,2,3,4,5,6])
result = map(lambda x:x*x, [1,2,3,4,5,6])
# for i in result:
#     print(i)
print(list(result))
[1, 4, 9, 16, 25, 36]
  • reduce(func,interable) 函數(shù)

累計操作,func函數(shù)必須接收兩個參數(shù),reduce會把func的運行結(jié)果作為一個參數(shù),然后從inteable中再取出一個數(shù)據(jù)作為另一個參數(shù)

from functools import reduce
li = [1,2,3,4,5,6]
result = reduce(lambda x,y:x*y,li)
#1*2=2 2*3=6 6*4=24...
print(result)
720
  • filter(func,interable)

根據(jù)函數(shù)func來過濾interable,將interable中的數(shù)據(jù)傳入函數(shù)func中,如果函數(shù)返回True,就保留該數(shù)據(jù),否則就不保留

li = [1, 2, 4, 5, 6, 9, 10, 15]
result = list(filter(lambda x: x % 2 == 1, li))
print(result)
[1, 5, 9, 15]
  • sort(interablen, kry = none, reverse = False)

對數(shù)據(jù)進行排序,key可以用來指定排序的規(guī)則,值是一個函數(shù),reverse是來指定排序的順序->升序或降序

li = [1, 2, -4, -10, 12]
# rs = li.sort() # 就地排序
res = sorted(li[:], key=abs, reverse=True)
print(res)
print(li)
[12, -10, -4, 2, 1]
[1, 2, -4, -10, 12]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容