函式:函式是指將一組陳述句的集合通過一個名字(函式名)封裝起來,要想執行這個函式,只需要呼叫其函式名即可,
特性: 減少重復代碼 是程式變的可擴展 是程式變得易維護
函式引數:
引數可以讓你的函式變得跟靈活,不只你能做死回圈的動作,還可以根據呼叫時傳參的不同來決定函式內部的執行流程
形參變數
只有在被呼叫的時候才分配記憶體單元,,在呼叫結束時,即可釋放所分配的記憶體單元,因此,形參只在函式內部有效,函式呼叫結束回傳主呼叫函式后則不能再使用該形參變數
實參
可是常量,變數,運算式,函式等,無論實參是何種型別的量,再進行函式呼叫時,他們都必須有確定的值,以便把這些值傳送給形參,
Def calc(x,y): x,y 形參
Res = x**y
Retrun res
C = calc(a,b) a,b 實參
默認引數必須要放在位置引數的后邊, def function(name ,age ,course,city=’北京’)
關鍵引數 def function(name,age,course=’py’,country=‘cn’) function(’張鑒’,course=’py’,age=22,country=’KOR’)
非固定引數 -- 方式一 以元祖形式的
def send_alert(msg,*args): #*之后的可以有很多同型別的引數,打包成元祖,例如賬戶郵箱等
for u in args:
print('warning!!!',u,msg)
send_alert('error!!','pig','ccn','zj')
非固定引數 -- 方式二 非固定引數必須放在最后習慣
uz = ['pig','ccn','zj']
def send_alert(msg,*user):
for u in user:
print('warning!!!',u,msg)
send_alert('error!!',*uz)
傳字典 就用**
def func(name,*args,**kw): #**is dic -zidian
print(name,args,kw)
dic = {'ccn':'zj'}
func('alex',22,'mashaladi','50w',addr='shandong',num=31344141,**dic)
函式-回傳值
函式外部的代碼想要獲取函式執行的結果,就可以在函式里用return陳述句把結果回傳
retrun 代表一個函式的結束 ,只要碰到retrun就結束,后邊有多少代碼都不執行了
函式-區域變數
指定義在函式里邊的變數 ,只能在區域生效,函式一點執行結束,變數就消失了在記憶體里
定義在函式頂層的一級代碼的變數,為全域變數,全域變數,全部代碼都可以呼叫
如果想在函式中使用修改全域變數可以使用global -- 不建議使用,一般情況下不用
函式-函式中修改串列中的資料
names = ['dogs','Black','pigs']
def change_name():
#global names
del names[2]
names[1] = 'Write'
names = [‘123’,’465’] #這個是不可以修改的,如果想要修改就要加上global
print(names)
change_name()
print(names)
函式-嵌套函式
def func1():
print('xdd')
def func2():
print('dogs')
func2()
func1( )
函式要想執行 必須被呼叫
函式-作用域
在Python中一個函式就是一個作用域,區域變數其實就是放在作用域中
代碼寫完之后作用域就生成了,無論函式在哪里呼叫了,被如何呼叫了,都會回到最初定義的地方進行向上查找,
函式- 匿名函式 lambda
def calc(x,y):
if x > y:
return x**y
else:
return x/y
func = lambda x,y:x**y if x < y else x/y #shengming anonymous function
print(func(3,3))
print(calc(3,3))
函式-高階函式
變數可以指向函式,函式的引數能接收變數,那么一個函式就可以接收另一個函式作為引數,這種函式就稱之為高階函式
可以將函式當做一個函式引數傳進來就是高階函式
只需要滿足任意一個條件,即是高階函式 1.接收一個或多個函式作為輸入引數2.return 回傳另外一個函式
遞回介紹 --遞回與堆疊的關系
遞回就是在函式的執行程序中呼叫自己
def recursion(n):
# sum(n)
print(n)
recursion(n+1)
recursion(1)
遞回的作用:可以解決一些復雜的數學問題,例如斐波那契,漢諾塔
遞回的特點:
1.必須有一個明確的結束條件,否則就會變成死回圈,最終撐爆系統記憶體
2.每次進入更深的一次遞回時,問題規模相比上次遞回都應有所減少
3.遞回執行效率不高,遞回層次過多會導致堆疊溢位
求階乘
def factorial(n):
if n == 1:
return 1
return n * factorial(n-1)
print(factorial(10))
尾遞回優化:
只保留一層函式的堆疊資料,他的當前層不需要等待上一層的結果,而是當前層就需要當前層的資料,但是在Python中即使你寫了尾遞回的優化也是沒有用的,Python還是會給你保留上千次的遞回,但是要明白概念,C語言是有這種優化的,
def cal(n):
print(n)
return cal(n+1)
cal(1)
內置函式 built-in function
abs 求絕對值
all # return True 例如串列中,可能有none,0,all會遍歷串列(資料結構)所有元素,只要有一個FALSE,就會顯示false
any 與all 相反,只要有一個True 就是True
ascii 回傳一個字符的ascii的值
bin 回傳一個整數的二進制格式
bool 判斷一個資料結構是True or FALSE bool([]) 空串列、集合、元祖、字典就是FALSE
bytearray # 把byte變成bytearray,可修改的陣列
bytes # bytes(“中國”,“utf-8”)
callable # 判斷一個物件是否可以呼叫,面向物件用的
chr #回傳一個數字的ascii字符, 比如char(97) 回傳就是a
Delattr # 面向物件用的
dir 回傳一個對象可呼叫,操作的屬性,功能
divmod #回傳除法的商和余數
enumerate # 回傳串列的索引和元素,比如 d = [“alex”,”jack”],enumerate(d) 之后得到(0,”alex”)(1,”jack”)
eval # 可以把字串形式的list,dict,set等,轉換成原有的資料型別
exec # 把字串格式的代碼 ,進行解釋并執行,比如exec("print('hello world')"), 就是解釋成print(‘hello world’) 并執行
exit # 退出程式
filter #對list、dict、set等可迭代的物件進行過濾 ,filter(lambda x: x>10, [1,2,3,4,56,66,77,9,10]),過濾出所有大于10的值 list(filter(lambda x:x > 10,[1,2,3,45,5,5,6,7,77])) [45, 77]
frozenset #將一個集合變成只讀
globals #列印全域作用于里的值,全域變數
hash # hash函式
hex #回傳一個10進制的16進制表現形式 例如hex(10) 回傳’0xa’
id #查看物件記憶體地址
isinstance #判斷一個資料結構的型別 isinstance(a,list) a是資料,list是資料型別 True
map #list(map(lambda x:x**2,a)) a是串列 map類似于filter
max # 求最大值 max(a)
min # 求最小值
Object #面向物件用
oct #8進制數
ord # 回傳acsii的字符對應的10進制數 ord(‘a’) 回傳97
reversed #可以將串列翻轉 和list.reverse() 功能一樣
round #可以把小數四舍五入成整數
Sum # 求和 a=[1,2,3] sum(a) 6
Zip # a= [1,2,3] b = ['a','b','c'] list(zip(a,b)) [(1, 'a'), (2, 'b'), (3, 'c')]
名稱空間 name spase
Name space ,顧名思義就是存放名字的地方 舉例說明: 變數 x=1 ,1存放于記憶體中,那名字x存放在哪里呢?名稱空間正式存放名字x與1系結關系的地方,
Python名稱空間有4中 :LEGB
Locals: 函式內部的名字空間,區域變數
Enclosing function:在嵌套函式中外部函式的名字空間,如果fun2嵌套在fun1里,對fun2來說,fun1的名字空間就是enclosing
Globals :當前的模塊空間,模塊就是一些py檔案,也就是說,globals()類似全域變數
_builtins_:內置模塊空間,也就是內置變數或內置函式的名字空間,存放內置方法之類的
不同變數的作用域不同就是由這個變數所在的名稱空間決定的,
閉包現象
def closure():
name = "alex"
def inner():
print("inner",name)
return inner
func = closure() # retrun inner mem address
func()
由于name變數被inner函式呼叫著,名稱空間得不到釋放,所以在函式外也可以被呼叫,這種情況情況叫做閉包
函式進階:裝飾器 ,又稱語法糖
在不改變源代碼和呼叫方式的情況下擴展一些新的功能:例如加上認證的模式
# -*- coding:utf-8 -*-
account = {
'is_auth' : False,
'alex' : '123',
'jack' : 'abc'
}
def login(func):
def inner():
if account['is_auth'] is False:
username = input('username>>').strip()
password = input('password>>').strip()
if username in account :
if password == account[username]:
print('welcome')
account['is_auth'] = True
func()
else :
print('password is error ,please try again')
else:
print('username not found ')
else:
print('user already login')
func()
return inner
def home():
print("---home page---")
@login
def tencent():
#login()
print('---tencetn---')
def alibaba():
print("---alibaba---")
@login
def jingdong():
#login()
print("---jingdong---")
home()
tencent = login(tencent) #這里存放的就是inner的記憶體地址,inner實作了閉包,不會執行里邊的func()
#print(tencent)
jingdong = login(jingdong)
tencent()
jingdong()
串列生成式
現有個需求,現有串列 a = [1,2,3,4,5,6] 要求你把串列里的每一個值加1. 如何是實作
a = [1,2,3,4,5,6775,9]
a = [i+1 for i in a] # list_builder 串列生成器
print(a)
生成器 -- generator
g = (x * x for x in range(10))
for i in g:
print(i)
函式生成器
# -*- coding:utf-8 -*-
def febonacci(n):
a = 0
b = 1
count = 0
while count < n:
tmp = a
a = b
b = tmp + b
#print(b)
yield b # 暫停 return
count +=1
f = febonacci(20)
print(next(f))
print(next(f))
print(next(f))
print(next(f))
用生成器實作并發編程
# -*- coding:utf-8 -*-
# def g_test():
# while True:
# n = yield
# print("receive from outside:",n)
#
# g = g_test()
# g.__next__() # 呼叫生成器,同時會發送None到yield
#
# for i in range(10):
# g.send(i) # 呼叫生成器,同時發送i
# 通過生成器實作多并發效果,執行緒就是cpu的執行的任務單元
# 吃包子 c1,c2,c3 消費者
# 生產者 product
def cosumer(name):
print("comsumer %s ready eat "%name)
while True:
baozi = yield
print("comsumer %s start eat num:%s"%(name,baozi))
c1 = cosumer("c1")
c1.__next__()
c2 = cosumer("c2")
c2.__next__()
c3 = cosumer("c3")
c3.__next__()
for i in range(10):
print("we product %s times baozi"%i)
c1.send(i)
c2.send(i)
c3.send(i)
迭代器
我們已經知道,可以直接作用于for回圈的資料型別有以下幾種:
1.一類是集合資料型別,如list、tuple、dict、set、str等
2.一類generator,包括生成器和帶yield的generator function,
這些可直接作用于for回圈的物件是否是iterable,可得帶的意思就是可遍歷、可回圈,
可以使用isinstance()判斷一個物件是否是Iterable物件,
迭代器 幾乎等同于 生成器
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/145100.html
標籤:Python
上一篇:任務25——第一次爬蟲測驗
