1 函數(shù)——提高代碼的利用率
函數(shù)的定義
無參數(shù)函數(shù)
def 函數(shù)名(): #首字母小寫
def print_hello(): #定義一個函數(shù)
print("Hello World!")
#定義的函數(shù)不會自行執(zhí)行,需要調(diào)用函數(shù)
print_hello()
帶參數(shù)的函數(shù)
def 函數(shù)名(參數(shù)1,參數(shù)2,參數(shù)3...): #參數(shù)名稱不用提前聲明,參數(shù)都是形參,形參特點,不用在前面定義,也不會和之前定義的變量沖突。
def cal(a,b):
sum=a+b
print("%s加上%s等于%s"%(a,b,sum))
a=1
cal(a,20) #傳給函數(shù)的數(shù)據(jù)叫實參。 a和20都是實參,需要具體的值或提前定義的變量
帶返回值的函數(shù)
def cal_area(r):
pi=3.1415926
return pi*(r**2) #return執(zhí)行后,return后面的代碼不執(zhí)行。return表示函數(shù)結(jié)束
r=9.9
res=cal_area(r)
print("半徑R=%d的面積:%.4f"%(r,res))
帶條件判斷的函數(shù)
def sum_2num(a,b):
if is_number(a) and is_number(b): #判斷是否是數(shù)字類型
sum = a + b
return sum
else:
print("沒法計算")
def is_number(a):
if not isinstance(a,(int,float)): #判斷是否是數(shù)字類型
print("傳入的參數(shù)%s不是數(shù)字類型"%a)
return False
else:
return True
a="A"
b="b"
s=sum_2num(a,b)
print(s)
函數(shù)——局部變量和全局變量
局部變量——函數(shù)里面定義的變量
全局變量——函數(shù)外面定義的變量
在函數(shù)中修改全局變量:
1、 如果是可變類型,可以執(zhí)行修改變量的值
2、 如果是不可變類型,修改全局變量其實是修改變量的引用
在函數(shù)中不使用global聲明全局變量時,不能修改全局變量的的本質(zhì),是不能修改全局變量的指向,即不能將全局變量指向新的數(shù)據(jù)
對于不可變類型的全局變量來說,因其指向的數(shù)據(jù)不能修改,所以不使用global時無法修改全局變量。
對于可變類型的全局變量來說,因基指向的數(shù)據(jù)可以修改,所以不使用global時也可修改全局變量。
全局變量定義在調(diào)用的函數(shù)之前
可變類型,值和引用均可改變
等號“=”用于改變可變和不可變類型的引用
name=['zhangshan','lis','ww']
stu={'name':'laowang'}
a='laogo'
b=100
def test1():
name[2]='zifei'
stu['age']=23
global a
a='golbin' #修改全局變量
global b
b+=1
test1()
print("修改后全局變量name的值%s"%name)
print("修改后全局變量stu的值%s"%stu)
print("修改后全局變量a的值%s"%a)
print("修改后全局變量b的值%s"%b)
函數(shù)返回多個值
def test():
a=1
b=2
return a,b
x,y=test()
print(x,y)
x=test()
print(x)
def test2():
a=1
b=2
return [a,b]
x=test2()
print(x)
結(jié)果:
1 2
(1, 2)
[1, 2]
函數(shù)參數(shù)
def test(x,y,z=10,w=20): #z的默認值為10
print("w=%s;x=%s;y=%s;z=%s"%(w,x,y,z))
return x+y+z
print(test(2,4),test(2,4,6),test(2,4,w=6))#指定第3個為w
結(jié)果:
w=20;x=2;y=4;z=10
w=20;x=2;y=4;z=6
w=6;x=2;y=4;z=10
16 12 16
不定長參數(shù)的函數(shù)
【例1】
def test(x,y,*args,z=10): #定義一個兩個以上參數(shù)的函數(shù)(*args參數(shù)個數(shù)不定)和一個包含缺省值的參數(shù),包含缺省值的參數(shù)放在后面
print(x,y,z,args)
sum=x+y+z
for i in args:
sum+=i
return sum
print("不修改缺省值和為%s;修改缺省值和為%s"%(test(1,2,3,4,5,6,8),test(1,2,3,4,5,6,8,z=20)))
結(jié)果:
1 2 10 (3, 4, 5, 6, 8)
1 2 20 (3, 4, 5, 6, 8)
不修改缺省值和為39;修改缺省值和為49
【例2】
def test2(x,*args,**kwargs):
# *args表示多個普通參數(shù),將多個參數(shù)收集到一個“元組”對象中
# **kwargs 多個有名字的參數(shù), 將多個參數(shù)收集到一個“字典”對象中
print("x=%s"%x)
print(args)
print(kwargs)
sum=x
for i in args:
sum+=i
for i in kwargs.values():
sum+=i
return sum
print("和1為%s"%test2(2,3,4,num1=5,num2=6))
print("="*50)
#集合的拆分
nums=[3,4,5]
nums2={'num1':5,'num2':6,'num3':7}
print("和2為%s"%test2(2,*nums,**nums2))
結(jié)果:
x=2
(3, 4)
{'num1': 5, 'num2': 6}
和1為20
==================================================
x=2
(3, 4, 5)
{'num1': 5, 'num2': 6, 'num3': 7}
和2為32
變量的引用
def test1(x,y):
x.replace("c","C") # 構(gòu)建新的字符串,未賦值給任何變量
y.append(10) # 傳入的列表為可變類型,新增元素不改變引用
print("x變量指向的內(nèi)存地址為:%s,%s"%(id(x),x))
print("y變量指向的內(nèi)存地址為:%s,%s" % (id(y),y))
x=x.replace("c", "C") #將新的字符串賦值給x變量,改變了引用
print("x2變量指向的內(nèi)存地址為:%s,%s" % (id(x),x))
a="abcdefg"
b=[1,2,3]
print("a變量指向的內(nèi)存地址為:%s,%s" % (id(a),a))
print("b變量指向的內(nèi)存地址為:%s,%s" % (id(b),b))
test1(a,b)
結(jié)果:
a變量指向的內(nèi)存地址為:2308406102816,abcdefg
b變量指向的內(nèi)存地址為:2308405617288,[1, 2, 3]
x變量指向的內(nèi)存地址為:2308406102816,abcdefg
y變量指向的內(nèi)存地址為:2308405617288,[1, 2, 3, 10]
x2變量指向的內(nèi)存地址為:2308407657336,abCdefg
遞歸函數(shù),在函數(shù)內(nèi)部調(diào)用函數(shù)本身
例1:
def test(n):
#遞歸函數(shù),計算數(shù)字n的階乘
#1、在函數(shù)內(nèi)部調(diào)用自己本身
#2、遞歸函數(shù)本質(zhì)上是一個方法的循環(huán)調(diào)用,有可能出現(xiàn)死循環(huán)
#3、一定要定義遞歸的邊界(什么時候退出循環(huán))
if n==1: #遞歸的邊界
return 1
return n*test(n-1)
n=4
print(test(n))
例2:
通過函數(shù)的遞歸,獲取斐波那契數(shù)列
#斐波那契數(shù)列,指的是這樣一個數(shù)列:1、1、2、3、5、8、13、21、34、……在數(shù)學(xué)上,斐波納契數(shù)列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
def F(n): #獲取斐波那契數(shù)列第n個的值
if n==1 or n==2:
return 1
return F(n-1)+F(n-2)
n=30
number=[]
for i in range(1,n+1):
number.append(F(i))
print(number)
匿名函數(shù)
用lambda關(guān)鍵字創(chuàng)建小型匿名函數(shù),省略了用def聲明函數(shù)的標準步驟,只包含一個語句:
Lambda [arg1[,arg2,arg3…]]:expression
例1:
fun=xy:x+y (fun())
例2:
def test(a,b,func):#定義三個變量
res=func(a,b)
return res
print(test(22,33,lambda x,y:x*y))#第三個變量用匿名函數(shù)賦值,計算方式可加、減根據(jù)需要修改靈活
例3,列表里面字典的排序:
stus=[{"name":"zs","age":23},{"name":"ww","age":33},{"name":"ls","age":34}]
stus.sort(key=lambda x:x["name"]) #當(dāng)前x為列表里面的元素(字典),取字典里面鍵為name的值進行排序
print(stus) #匿名函數(shù)的功能,返回列表中每個元素(字典)的name對應(yīng)的值
例4,動態(tài)
def test(a,b,func):
res=func(a,b)
return res
func_new=input("請輸入你的操作:")
func_new=eval(func_new)#字符串轉(zhuǎn)為可以執(zhí)行的表達式
print(test(22,33,func_new))
結(jié)果:
請輸入你的操作:lambda x,y:x+y
55
閉包
內(nèi)部函數(shù)對外部函數(shù)作用域里變量的引用(非全局變量),則稱內(nèi)部函數(shù)為閉包。
例1

例2:

閉包的應(yīng)用,一元一次方程

常用內(nèi)置函數(shù)
函數(shù) | 說明 |
int(x[,base]) | 將x轉(zhuǎn)換為一個整數(shù) |
long(x[,base]) | 將x轉(zhuǎn)換為一個長整數(shù) |
float(x) | 將x轉(zhuǎn)換為一個浮點數(shù) |
complex(rel[,imag]) | 創(chuàng)建一個復(fù)數(shù) |
str(x) | 將對象x轉(zhuǎn)換為字符串 |
repr(x) | 將對象x轉(zhuǎn)換為表達式字符串 |
eval(str) | 用來計算在字符串中的有效python表達式,并返回一個對象 |
tuple(s) | 將序列s轉(zhuǎn)換為一個元組 |
list(s) | 將序列s轉(zhuǎn)換為一個列表 |
chr(x) | 將一個整數(shù)轉(zhuǎn)換為一個字符 |
unichr(x) | 將一個整數(shù)轉(zhuǎn)換為unicode字符 |
ord(x) | 將一個字符轉(zhuǎn)換為它的整數(shù)值 |
hex(x) | 將一個整數(shù)轉(zhuǎn)換為一個十六進制字符串 |
oct(x) | 將一個整數(shù)轉(zhuǎn)換為一個八進制字符串 |
|
|
Cmp(item1,item2) | 比較兩個值,python2中 |
Len(item) | 計算元素個數(shù) |
Max(item) | 返回元素最大值 |
Min(item) | 返回元素最小值 |
Del(item) | 刪除元素 |
cmp函數(shù)(python2)
cmp(item1,item2)比較兩個值,相等返回0,item1小于item2返回-1,item1大于item2,返回1
>>> a=1
>>> b=4
>>> c=cmp(a,b)
>>> c
-1
>>> a="f"
>>> b="e"
>>> c=cmp(a,b)
>>> c
1
統(tǒng)計字符出現(xiàn)次數(shù)
str=input("Please input str:")
res={}
for i in str:
if i in res:
res[i]=res[i]+1
else:
res[i]=1
print(res)
內(nèi)建函數(shù)
dir(__builtins__)
Ø range(start,stop[,step]) 計數(shù)從start開始,默認是從0開始,到stop結(jié)束,但不包括stop;每次跳躍的間距,默認為1
Ø map(function,sequence[,sequence,…])根據(jù)提供的函數(shù),對指定序列做映射
python2直接返回列表,python3返回一個迭代器

python3


Ø filter(function or None,sequence) 對指定序列執(zhí)行過濾操作,python3返回一個filter對象,是一個迭代器;Python2直接返回列表
python2 | 
|
python3 |  |
Ø reduce(function,sequence[,initial]) 對參數(shù)序列中元素進行累積
在python3里面,reduce()函數(shù)已經(jīng)被從全局名字空間里移除了,它現(xiàn)在被放置在fuctools模塊里面
