status函数python_python之路-函数
本節內容
1. 函數基本語法及特性
2. 參數與局部變量
3. 返回值
嵌套函數
4.遞歸
5.匿名函數
6.函數式編程介紹
7.高階函數
8.內置函數
函數是什么?
函數一詞來源于數學,但編程中的「函數」概念,與數學中的函數是有很大不同的,具體區別,我們后面會講,編程中的函數在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子過程或子程序),在Pascal中叫做procedure(過程)和function,在C中只有function,在Java里面叫做method。
定義: 函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名即可
特性:
減少重復代碼
使程序變的可擴展
使程序變得易維護
def 函數名(): 括號是用來傳參的,靈活應用
函數名() #調用
形參:變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只在函數內部有效。函數調用結束返回主調用函數后則不能再使用該形參變量
實參:可以是常量、變量、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值
def sayhi(name,age,nationality='CN'): -----name、age是形參 ,有的默認參數都放在非默認參數(位置參數)的右邊print('i am %s,' %name,age,nationality) -----如果不調用,就安默認打印,
sayhi('haha',22) ------haha、22是實參
sayhi('haha',22,US) ------如果傳參的話就打印傳入的內容
sayhi(name= '11',22) ------指定參數傳參,也的放在位置參數后面 關鍵參數,如果給其中一個寫定,并且不按順序寫,其他的都的寫定。
關鍵參數
正常情況下,給函數傳參數要按順序,不想按順序就可以用關鍵參數,只需指定參數名即可,但記住一個要求就是,關鍵參數必須放在位置參數之后。
非固定參數
若你的函數在定義時不確定用戶想傳入多少個參數,就可以使用非固定參數。
def sayhi(name,age,nationality='CN',*args): *args以元組的形式存在,如果寫單個元素就是元組。
def sayhi(name,age,nationality='CN',**kwargs) **kwargs以字典的形式存在,如果寫name = 'lwq',就寫入字典中。
全局與局部變量
在子程序中定義的變量稱為局部變量,在程序的一開始定義的變量稱為全局變量。
全局變量作用域是整個程序,局部變量作用域是定義該變量的子程序。
當全局變量與局部變量同名時:
在定義局部變量的子程序內,局部變量起作用;在其它地方全局變量起作用。
login_status = False #全局變量 雖然與局部變量名字相同,但是在內存中的地址不一樣
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 #局部變量,只在函數中生效
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.一旦你的函數經過調用并開始執行,那你的函數外部的程序就沒有辦法再控制函數的執行的過程了,此時外部程序只能等待函數的執行結果,因為外部程序要根據外部函數的執行結果來決定下一步如何走,
執行結果就是以return的形式返回給外部程序。
2.return代表著一個函數的結束。
3.return可以返回python中的任何數據類型,一次能返回多個值,以元組的形式返回。
4.對于用戶角度,函數可以返回任意數量的值,但對于py本身來講,函數只能返回一個。
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()
嵌套函數
name = 'alex'
defchangeName():
name= 'jack'
print(name)defchangeName2():
name= 'rain'
print('name2', name)
changeName2()
changeName()
遞歸函數
特性:
1.必須有一個明確的結束條件
2.每進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少
3.遞歸效率不高,遞歸層次過多會導致棧溢出(在計算機中,函數調用是通過stack這種數據結構實現的)
每當進入一個函數,棧就會加一層棧幀,每當函數減少一層,棧幀就減少一層。
遞歸函數的典型事例:二分查找
#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)
匿名函數:
匿名函數就是不需要顯式的指定函數
正常定義函數:
defcalc(n):return n*n
print(cacl)
def calc(n,j):
return n*j
print(cacl)
匿名函數:
calc2 = lambda x:x*xprint(cacl2)
calc2 = lambda x,y:x*x
calc(8)
與map函數搭配使用
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
上面的匿名函數與map搭配使用中就用到了三元運算。
函數式編程介紹
函數是Python內建支持的一種封裝,我們通過把大段代碼拆成函數,通過一層一層的函數調用,就可以把復雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程序設計。函數就是面向過程的程序設計的基本單元。
函數式編程中的函數這個術語不是指計算機中的函數(實際上是Subroutine),而是指數學中的函數,即自變量的映射。也就是說一個函數的值僅決定于函數參數的值,不依賴其他狀態。比如sqrt(x)函數計算x的平方根,只要x不變,不論什么時候調用,調用幾次,值都是不變的。
Python對函數式編程提供部分支持。由于Python允許使用變量,因此,Python不是純函數式編程語言。
一、定義
簡單說,"函數式編程"是一種"編程范式"(programming paradigm),也就是如何編寫程序的方法論。
主要思想是把運算過程盡量寫成一系列嵌套的函數調用。舉例來說,現在有這樣一個數學表達式:
(1 + 2) * 3 - 4
傳統的過程式編程,可能這樣寫:
var a = 1 + 2;
var b = a * 3;
var c = b - 4;
函數式編程要求使用函數,我們可以把運算過程定義為不同的函數,然后寫成下面這樣:
var result = subtract(multiply(add(1,2), 3), 4);
這段代碼再演進以下,可以變成這樣
add(1,2).multiply(3).subtract(4)
這基本就是自然語言的表達了。再看下面的代碼,大家應該一眼就能明白它的意思吧:
merge([1,2],[3,4]).sort().search("2")
因此,函數式編程的代碼更容易理解。
高階函數
變量可以指向函數,函數的參數能接收變量,那么一個函數就可以接收另一個函數作為參數,這種函數就稱之為高階函數。
abs求絕對值defadd(x,y,f):return f(x) +f(y)defcalc(n):return n+1res= add(3,-6,cacl)print(res)
編程范式:
1.面向過程
2.面向對象
3.函數式編程
內置函數
python自帶
a = [1,2,3]
all(a)
#判斷是否為真
any() #列表任意一個為真就返回真
ascii() #顯示成ascii表的東西
bin() #將數字轉成二進制
print(bin(10))
bool #判斷是否為true
bytes #0-255之間的數字,ascii表
bytearray #改bytes值
callable() #判斷對象是否可以被調用
chr() #把數字轉換成二進制
print(chr(97)) #打印ascii表的對應關系
print(ord('b')) #將字符對應成ascii表中的數字
f = open('遞歸.py',encoding='utf-8')
code = compile(f.readline(),'','exec')
print(code)
exec(code) #執行這段代碼,這段代碼是字符串
eval() #數字運算
complex #復數
complex(4,5)
print(dir(f)) #dir返回文件的方法
divmod() #地板除,放回商和余數
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()) #把當前程序所在內存中所有的數據都以字典的形式打印出來
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) #反轉(字符串、列表)
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) 以列表的形式打印,字符竄、集合、列表(并且其中只能由一種數據類型)
data = [10,2,3,45,56,3]
print(sum(data)) #相加 列表、集合、元組都可相加。
print(vars()) #打印當前程序在內存中的所有數據
zip # 類似拉鏈效應,如果對應不上,就按少的來
a = [1,3,5,7]
b = [2,4,6,8]
for i in zip(a,b):
print(i)
總結
以上是生活随笔為你收集整理的status函数python_python之路-函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下载网页TS流视频无需手动合并
- 下一篇: Python第三方库安装及常见问题