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!
- 內(nèi)層函數(shù)可以訪問外層函數(shù)的變量,但不能修改
- 內(nèi)層函數(shù)訪問變量時會先從自己查找,如果找不到,就會層層向上查找
- python中變量的作用域是以函數(shù)為單位的
- global修飾變量時,說明使用的是最外層的全局變量
- 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ù)
- 累加
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
- 累乘
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]