status函数python_python之路-函数
本節(jié)內(nèi)容
1. 函數(shù)基本語法及特性
2. 參數(shù)與局部變量
3. 返回值
嵌套函數(shù)
4.遞歸
5.匿名函數(shù)
6.函數(shù)式編程介紹
7.高階函數(shù)
8.內(nèi)置函數(shù)
函數(shù)是什么?
函數(shù)一詞來源于數(shù)學(xué),但編程中的「函數(shù)」概念,與數(shù)學(xué)中的函數(shù)是有很大不同的,具體區(qū)別,我們后面會講,編程中的函數(shù)在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子過程或子程序),在Pascal中叫做procedure(過程)和function,在C中只有function,在Java里面叫做method。
定義: 函數(shù)是指將一組語句的集合通過一個名字(函數(shù)名)封裝起來,要想執(zhí)行這個函數(shù),只需調(diào)用其函數(shù)名即可
特性:
減少重復(fù)代碼
使程序變的可擴展
使程序變得易維護
def 函數(shù)名(): 括號是用來傳參的,靈活應(yīng)用
函數(shù)名() #調(diào)用
形參:變量只有在被調(diào)用時才分配內(nèi)存單元,在調(diào)用結(jié)束時,即刻釋放所分配的內(nèi)存單元。因此,形參只在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結(jié)束返回主調(diào)用函數(shù)后則不能再使用該形參變量
實參:可以是常量、變量、表達式、函數(shù)等,無論實參是何種類型的量,在進行函數(shù)調(diào)用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應(yīng)預(yù)先用賦值,輸入等辦法使參數(shù)獲得確定值
def sayhi(name,age,nationality='CN'): -----name、age是形參 ,有的默認參數(shù)都放在非默認參數(shù)(位置參數(shù))的右邊print('i am %s,' %name,age,nationality) -----如果不調(diào)用,就安默認打印,
sayhi('haha',22) ------haha、22是實參
sayhi('haha',22,US) ------如果傳參的話就打印傳入的內(nèi)容
sayhi(name= '11',22) ------指定參數(shù)傳參,也的放在位置參數(shù)后面 關(guān)鍵參數(shù),如果給其中一個寫定,并且不按順序?qū)?#xff0c;其他的都的寫定。
關(guān)鍵參數(shù)
正常情況下,給函數(shù)傳參數(shù)要按順序,不想按順序就可以用關(guān)鍵參數(shù),只需指定參數(shù)名即可,但記住一個要求就是,關(guān)鍵參數(shù)必須放在位置參數(shù)之后。
非固定參數(shù)
若你的函數(shù)在定義時不確定用戶想傳入多少個參數(shù),就可以使用非固定參數(shù)。
def sayhi(name,age,nationality='CN',*args): *args以元組的形式存在,如果寫單個元素就是元組。
def sayhi(name,age,nationality='CN',**kwargs) **kwargs以字典的形式存在,如果寫name = 'lwq',就寫入字典中。
全局與局部變量
在子程序中定義的變量稱為局部變量,在程序的一開始定義的變量稱為全局變量。
全局變量作用域是整個程序,局部變量作用域是定義該變量的子程序。
當(dāng)全局變量與局部變量同名時:
在定義局部變量的子程序內(nèi),局部變量起作用;在其它地方全局變量起作用。
login_status = False #全局變量 雖然與局部變量名字相同,但是在內(nèi)存中的地址不一樣
defauth(username,password):#get date from db
_username = 'alex'_password= 'alex3714'
if username == _username and password ==_password:print('ok')#global login_status #改全局變量,要用global,并且將原來的全局變量寫上
login_status = True #局部變量,只在函數(shù)中生效
print('--->',login_status)defhome():if login_status ==True:print('welcome')else:
auth()defpay():if login_status ==True:print('welcome')else:
auth()
username= input('username:').strip()
password= input('password:').strip()
auth()
返回值:
1.一旦你的函數(shù)經(jīng)過調(diào)用并開始執(zhí)行,那你的函數(shù)外部的程序就沒有辦法再控制函數(shù)的執(zhí)行的過程了,此時外部程序只能等待函數(shù)的執(zhí)行結(jié)果,因為外部程序要根據(jù)外部函數(shù)的執(zhí)行結(jié)果來決定下一步如何走,
執(zhí)行結(jié)果就是以return的形式返回給外部程序。
2.return代表著一個函數(shù)的結(jié)束。
3.return可以返回python中的任何數(shù)據(jù)類型,一次能返回多個值,以元組的形式返回。
4.對于用戶角度,函數(shù)可以返回任意數(shù)量的值,但對于py本身來講,函數(shù)只能返回一個。
defauth():
username= input('username:').strip()
password= input('password:').strip()#get date from db
_username = 'alex'_password= 'alex3714'
if username == _username and password ==_password:print('ok')returnTrueelse:returnFalsedefhome():if login_status ==True:print('welcome')else:
auth()defpay():if login_status ==True:print('welcome')else:
auth()
login_status=auth()
home()
pay()
嵌套函數(shù)
name = 'alex'
defchangeName():
name= 'jack'
print(name)defchangeName2():
name= 'rain'
print('name2', name)
changeName2()
changeName()
遞歸函數(shù)
特性:
1.必須有一個明確的結(jié)束條件
2.每進入更深一層遞歸時,問題規(guī)模相比上次遞歸都應(yīng)有所減少
3.遞歸效率不高,遞歸層次過多會導(dǎo)致棧溢出(在計算機中,函數(shù)調(diào)用是通過stack這種數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的)
每當(dāng)進入一個函數(shù),棧就會加一層棧幀,每當(dāng)函數(shù)減少一層,棧幀就減少一層。
遞歸函數(shù)的典型事例:二分查找
#data = [3,5,10,1,12,14,17,11,19,20,19]#date = [1,3,5,10,11,12,14,17,19,19,20]
date = range(0,10000,3) #range 出來就是列表
defbinary_search(datasets,find_num):if len(datasets) >0:
middle_pos= int(len(datasets)/2)if date[middle_pos] ==find_num:print('Find num:',datasets[middle_pos])elif date[middle_pos] >find_num:print('go to left side',datasets[0:middle_pos],datasets[middle_pos])
binary_search(datasets[0:middle_pos],find_num)else:print('go to righ side',datasets[middle_pos+1:],datasets[middle_pos])
binary_search(datasets[middle_pos+1:],find_num)else:print('cannot not find num')
binary_search(date,15)
匿名函數(shù):
匿名函數(shù)就是不需要顯式的指定函數(shù)
正常定義函數(shù):
defcalc(n):return n*n
print(cacl)
def calc(n,j):
return n*j
print(cacl)
匿名函數(shù):
calc2 = lambda x:x*xprint(cacl2)
calc2 = lambda x,y:x*x
calc(8)
與map函數(shù)搭配使用
data = map(lambda n:n*2 if n>5 else n,range(10))
data = map(lambda n:n*2 if n>5 else calc(n),range(10))
def cal(n):
return -n
data = map(lambda n:n**n if n>5 else cal(n),range(10))
for i in data:
print(i)
三元運算
a =4
b= 5
c = if a >10 else b
上面的匿名函數(shù)與map搭配使用中就用到了三元運算。
函數(shù)式編程介紹
函數(shù)是Python內(nèi)建支持的一種封裝,我們通過把大段代碼拆成函數(shù),通過一層一層的函數(shù)調(diào)用,就可以把復(fù)雜任務(wù)分解成簡單的任務(wù),這種分解可以稱之為面向過程的程序設(shè)計。函數(shù)就是面向過程的程序設(shè)計的基本單元。
函數(shù)式編程中的函數(shù)這個術(shù)語不是指計算機中的函數(shù)(實際上是Subroutine),而是指數(shù)學(xué)中的函數(shù),即自變量的映射。也就是說一個函數(shù)的值僅決定于函數(shù)參數(shù)的值,不依賴其他狀態(tài)。比如sqrt(x)函數(shù)計算x的平方根,只要x不變,不論什么時候調(diào)用,調(diào)用幾次,值都是不變的。
Python對函數(shù)式編程提供部分支持。由于Python允許使用變量,因此,Python不是純函數(shù)式編程語言。
一、定義
簡單說,"函數(shù)式編程"是一種"編程范式"(programming paradigm),也就是如何編寫程序的方法論。
主要思想是把運算過程盡量寫成一系列嵌套的函數(shù)調(diào)用。舉例來說,現(xiàn)在有這樣一個數(shù)學(xué)表達式:
(1 + 2) * 3 - 4
傳統(tǒng)的過程式編程,可能這樣寫:
var a = 1 + 2;
var b = a * 3;
var c = b - 4;
函數(shù)式編程要求使用函數(shù),我們可以把運算過程定義為不同的函數(shù),然后寫成下面這樣:
var result = subtract(multiply(add(1,2), 3), 4);
這段代碼再演進以下,可以變成這樣
add(1,2).multiply(3).subtract(4)
這基本就是自然語言的表達了。再看下面的代碼,大家應(yīng)該一眼就能明白它的意思吧:
merge([1,2],[3,4]).sort().search("2")
因此,函數(shù)式編程的代碼更容易理解。
高階函數(shù)
變量可以指向函數(shù),函數(shù)的參數(shù)能接收變量,那么一個函數(shù)就可以接收另一個函數(shù)作為參數(shù),這種函數(shù)就稱之為高階函數(shù)。
abs求絕對值defadd(x,y,f):return f(x) +f(y)defcalc(n):return n+1res= add(3,-6,cacl)print(res)
編程范式:
1.面向過程
2.面向?qū)ο?/p>
3.函數(shù)式編程
內(nèi)置函數(shù)
python自帶
a = [1,2,3]
all(a)
#判斷是否為真
any() #列表任意一個為真就返回真
ascii() #顯示成ascii表的東西
bin() #將數(shù)字轉(zhuǎn)成二進制
print(bin(10))
bool #判斷是否為true
bytes #0-255之間的數(shù)字,ascii表
bytearray #改bytes值
callable() #判斷對象是否可以被調(diào)用
chr() #把數(shù)字轉(zhuǎn)換成二進制
print(chr(97)) #打印ascii表的對應(yīng)關(guān)系
print(ord('b')) #將字符對應(yīng)成ascii表中的數(shù)字
f = open('遞歸.py',encoding='utf-8')
code = compile(f.readline(),'','exec')
print(code)
exec(code) #執(zhí)行這段代碼,這段代碼是字符串
eval() #數(shù)字運算
complex #復(fù)數(shù)
complex(4,5)
print(dir(f)) #dir返回文件的方法
divmod() #地板除,放回商和余數(shù)
divmod(10,2)
filter #過濾
for i in filter(lambda x:x>5,range(10)):
print(i)
format() #字符串格式化
frozenset({1,4,5,5,6}) #把集合變成只讀
print(a)
#就沒有add方法
globals()
print(globals()) #把當(dāng)前程序所在內(nèi)存中所有的數(shù)據(jù)都以字典的形式打印出來
locals() #只打印局部
hex() #十六進制
print(hex(8))
max() #返回列表匯總最大值
print(max())
min() #返回最小值
oct() #八進制0o8
print(pow(4,9)) #4**9
#分隔符
msg = "又回到最初的起點"
f = open("tofile","w")
print(msg,"記憶中你青澀的臉",sep="|",end="",file=f)
data = [1,2,3,5,8]
data = reversed(data) #反轉(zhuǎn)(字符串、列表)
for i in data:
print(i)
round() #五舍六入
print(round(10.25,1))
data = [10,2,4]
print(set(data)) #將列表變成集合
#切片
a = range(20)
pattern = slice(3,8,1)
for i in a[pattern]:
print(i)
a= 'alex'
a= sorted(a) #按ascii碼排序
print(a) 以列表的形式打印,字符竄、集合、列表(并且其中只能由一種數(shù)據(jù)類型)
data = [10,2,3,45,56,3]
print(sum(data)) #相加 列表、集合、元組都可相加。
print(vars()) #打印當(dāng)前程序在內(nèi)存中的所有數(shù)據(jù)
zip # 類似拉鏈效應(yīng),如果對應(yīng)不上,就按少的來
a = [1,3,5,7]
b = [2,4,6,8]
for i in zip(a,b):
print(i)
總結(jié)
以上是生活随笔為你收集整理的status函数python_python之路-函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下载网页TS流视频无需手动合并
- 下一篇: websocket python爬虫_p