python基础语言法则_python语言基础3
一:python函數(shù)
是組織好的,可重復(fù)使用的,用來實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼塊。以前使用過的一些Python提供的內(nèi)建函數(shù),如print()、max(4,18)、min(100,50)。當(dāng)然我們自己創(chuàng)建的函數(shù),叫做自定義函數(shù)。
①、代碼要遵循的原則:高內(nèi)聚,低耦合
模塊內(nèi)部之間的聯(lián)系,應(yīng)該非常緊密的
模塊與模塊之間的聯(lián)系,應(yīng)該盡量少
②、優(yōu)點(diǎn):
函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。
③、定義函數(shù)的場(chǎng)合:
凡是我們需要描述某個(gè)功能的時(shí)候,都將它定義為函數(shù)
④、函數(shù)定義規(guī)則:
函數(shù)代碼塊以 def 關(guān)鍵詞開頭,后接函數(shù)標(biāo)識(shí)符名稱和圓括號(hào) ()。任何傳入?yún)?shù)和自變量必須放在圓括號(hào)中間,圓括號(hào)之間可以用于定義參數(shù)。 函數(shù)內(nèi)容以冒號(hào)起始,并且縮進(jìn)。
return [表達(dá)式] 結(jié)束函數(shù),選擇性地返回一個(gè)值給調(diào)用方。不寫return,相當(dāng)于返回 None。
⑤、定義函數(shù)格式:
def 函數(shù)名(參數(shù)列表):
函數(shù)體
函數(shù)調(diào)用:
函數(shù)不調(diào)用就不會(huì)執(zhí)行,調(diào)用函數(shù)通過函數(shù)名完成
⑥、建議:
函數(shù)的第一行語句,可以選擇性地使用文檔字符串,用于存放函數(shù)說明,函數(shù)定義時(shí),一個(gè)函數(shù)的功能要單一。
1、簡(jiǎn)單定義函數(shù)
#定義函數(shù)
def hello() :
print("Hello Python ...!")
#調(diào)用函數(shù) 函數(shù)不調(diào)用,不執(zhí)行
hello()
運(yùn)行結(jié)果:
Hello Python ...!
2、簡(jiǎn)單實(shí)現(xiàn)業(yè)務(wù)
#定義函數(shù),實(shí)現(xiàn)打印5行5列的*號(hào)
def print_tr() :
for i in range(5):
for j in range(5):
print("* ",end="")
print()
#調(diào)用
print_tr()
運(yùn)行結(jié)果:
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
3、在函數(shù)中,定義參數(shù)
函數(shù)是否需要未知數(shù)參與,需要可以用參數(shù)定義出來。
#計(jì)算兩個(gè)數(shù)之和
#2個(gè)數(shù)是未知數(shù),未知數(shù)相當(dāng)于python的參數(shù)
def add(a,b):
#print('{0}+{1}={2}'.format(a,b,a+b))
print('%s+%s=%s'%(a,b,a+b))
#調(diào)用
add(7,8)
運(yùn)行結(jié)果:
7+8=15
4、在函數(shù)中,指定返回值
return [表達(dá)式] 結(jié)束函數(shù),選擇性地返回一個(gè)值給調(diào)用方,不帶表達(dá)式的return相當(dāng)于返回None。
#調(diào)addCopy01()函數(shù),返回兩個(gè)數(shù)之和的值
def addCopy01(a,b):
return a+b
#調(diào)用
result = addCopy01(100,200)
print(result)
print('-------------------------------')
#return 直接結(jié)束函數(shù),'函數(shù)結(jié)束'提示,沒有輸出。
def test_method():
for i in range(10):
print(i)
return # return結(jié)束函數(shù) break結(jié)束循環(huán)
print('函數(shù)結(jié)束')
#調(diào)用
test_method()
運(yùn)行結(jié)果:
300
-------------------------------
0
5、參數(shù)類型
①、必需參數(shù)
必需參數(shù)須以正確的順序傳入函數(shù)。調(diào)用時(shí)的數(shù)量必須和聲明時(shí)的一樣。調(diào)用函數(shù),你必須傳入?yún)?shù),不然會(huì)出現(xiàn)語法錯(cuò)誤:
#必須傳入,2個(gè)參數(shù)
def addCopy01(a,b):
return a+b
#調(diào)用
addCopy01(100,200)
②、關(guān)鍵字參數(shù)
關(guān)鍵字參數(shù)和函數(shù)調(diào)用關(guān)系緊密,函數(shù)調(diào)用使用關(guān)鍵字參數(shù)來確定傳入的參數(shù)值。使用關(guān)鍵字參數(shù)允許函數(shù)調(diào)用時(shí)參數(shù)的順序與聲明時(shí)不一致:
#關(guān)鍵字參數(shù):
def printinfo(name, age):
print("名字: ", name)
print("年齡: ", age)
#調(diào)用
printinfo(age=50, name="張三")
運(yùn)行結(jié)果:
名字: 張三
年齡: 50
③、默認(rèn)參數(shù)
調(diào)用函數(shù)時(shí),如果沒有傳遞參數(shù),則會(huì)使用默認(rèn)參數(shù)。
#默認(rèn)參數(shù):
def printinfo(name, age=35):
print("名字: ", name)
print("年齡: ", age)
#調(diào)用
printinfo(name="張三",age=50)
print("------------------------")
printinfo(name="張三")
運(yùn)行結(jié)果:
名字: 張三
年齡: 50
------------------------
名字: 張三
年齡: 35
④、不定長(zhǎng)參數(shù)
有時(shí)可能需要一個(gè)函數(shù)能處理比當(dāng)初聲明時(shí)更多的參數(shù)。這些參數(shù)叫做不定長(zhǎng)參數(shù)。
加了星號(hào)(*)的參數(shù)名,會(huì)存放所有未命名的變量參數(shù)。如果在函數(shù)調(diào)用時(shí),沒有指定參數(shù),它就是一個(gè)空元組。
#查看不定長(zhǎng)參數(shù),傳入的值
def add2(a,*b):
print(a,end="")
print(b)
#調(diào)用
add2(1) #1()
add2(1,2) #1(2,)
add2(1,2,3) #1(2, 3)
print("------------------------")
#求和 [不限制幾個(gè)參數(shù)]
def add3(a,*b):
sum = 0
for i in b:
sum += i
return a+sum
#調(diào)用
print(add3(1))
print(add3(1,2))
print(add3(1,2,3))
運(yùn)行結(jié)果:
1()
1(2,)
1(2, 3)
------------------------
1
3
6
python 使用 lambda 來創(chuàng)建匿名函數(shù)。所謂匿名,意即不再使用 def 語句來定義一個(gè)函數(shù)。
①、lambda 函數(shù)的語法只包含一個(gè)語句
②、命名空間:python中存放變量名的空間或字典!
注意:
①、lambda 只是一個(gè)表達(dá)式,函數(shù)體比 def 簡(jiǎn)單很多。
②、 lambda的主體是一個(gè)表達(dá)式,而不是一個(gè)代碼塊。僅僅能在lambda表達(dá)式中封裝有限的邏輯進(jìn)去。
③、 lambda 函數(shù)擁有自己的命名空間,且不能訪問自己參數(shù)列表之外或全局命名空間里的參數(shù)。
sum = lambda a,b:a+b
print(sum(10,20))
運(yùn)行結(jié)果:
30
7、參數(shù)傳遞問題
①、對(duì)象是真實(shí)存在的數(shù)據(jù),類型屬于對(duì)象,變量是沒有類型的。
number = [1,2,3,4,5,6]
info = "Hello"
解釋:[1,2,3,4,5,6] 是 List 類型,“Hello” 是 String 類型,而變量number與info是沒有類型,它僅僅是一個(gè)對(duì)象的引用(一個(gè)指針),可以是指向 List 類型對(duì)象,也可以是指向 String 類型對(duì)象
②、可更改與不可更改對(duì)象
python 中一切都是對(duì)象,傳遞參數(shù)分為傳不可變對(duì)象和傳可變對(duì)象
python 中,string字符串,tuple元組,和numbers整數(shù),是不可更改的對(duì)象,而list列表,dict字典等則是可以修改的對(duì)象。
使用函數(shù)的時(shí)候,如果傳入?yún)?shù)是不可變的,那么參數(shù)里面對(duì)數(shù)據(jù)做的任何操作,都不會(huì)對(duì)函數(shù)外面的數(shù)據(jù)帶來影響。不可變類型:如fun(a),傳遞的只是a 的值,沒有影響a對(duì)象本身。比如在 fun(a)內(nèi)部修改 a 的值,只是修改另一個(gè)復(fù)制的新對(duì)象,不會(huì)影響 a 本身。
# 不可變類型參數(shù)傳遞
num = 1
def change(num):
num = 3 #沒有對(duì)num操作,重新定義了一個(gè)num
print(num)
change(num)
print(num) #不會(huì)影響函數(shù)外,num本身的值
print('----------------------')
# 返回值例外
num2 = 1
def change(num2):
print(num2) # 1
num2 = 3
return num2
num_result = change(num2)
print(num_result) #返回值例外 3
print(num2) #函數(shù)內(nèi)改變,不影響函數(shù)外的不可變對(duì)象 1
運(yùn)行結(jié)果:
3
1
----------------------
1
3
1
可變對(duì)象類型:如 fun(la),則是將 la 真正的傳過去,在函數(shù)內(nèi)部,修改后,fun外部的la也會(huì)受影響
list_num = [1,2]
def change(list_num):
list_num.append(3)
print(list_num) #[1, 2, 3]
change(list_num)
print(list_num) #[1, 2, 3]
運(yùn)行結(jié)果:
[1, 2, 3]
[1, 2, 3]
二:變量作用域
Python 中,程序的變量并不是在哪個(gè)位置都可以訪問的,訪問權(quán)限決定于這個(gè)變量是在哪里賦值的。變量的作用域決定了在哪一部分程序可以訪問哪個(gè)特定的變量名稱。
Python的作 用域一共有4種,從小到大分別是:
L (Local) 局部作用域
局部作用域,即函數(shù)中定義的變量
局部變量(只能在函數(shù)內(nèi)部使用)
E (Enclosing) 閉包函數(shù)外的函數(shù)中
嵌套的父級(jí)函數(shù)的局部作用域,即包含此函數(shù)的上級(jí)函數(shù)的局部作用域,但不是全局的;
G (Global) 全局作用域
全局變量,就是模塊(python文件)級(jí)別定義的變量;
定義在函數(shù)外的變量
B (Built-in) 內(nèi)建作用域
系統(tǒng)固定模塊里面的變量,比如int, bytearray等。
總結(jié):以 L –> E –> G –>B 的規(guī)則查找,即:在局部找不到,便會(huì)去局部外的局部找(例如閉包),再找不到就會(huì)去全局找,再者去內(nèi)建中找,內(nèi)建中找不到程序報(bào)錯(cuò)
name = str('張三') #python內(nèi)置的作用域 ->內(nèi)建作用域
y = 2 #全局 ->全局作用域
def outer():
a = 3 #閉包 -> 閉包
def inner():
b=2 #局部 ->局部作用域
print(a)
inner()
#print(b) #報(bào)錯(cuò)
outer()
#print(a) #報(bào)錯(cuò)
運(yùn)行結(jié)果:
3
1、作用域一
Python 中只有模塊(module),類(class)以及函數(shù)(def、lambda)才會(huì)引入新的作用域(有作用域的限制);其它的代碼塊(如 if/elif/else/、try/except、for/while等)是不會(huì)引入新的作用域的,也就是說這些語句內(nèi)定義的變量,外部也可以訪問。
# 實(shí)例中 msg 變量定義在 if 語句塊中,但外部還是可以訪問的。
if True:
msg = "ok"
print(msg)
# 實(shí)例中 msg 定義在函數(shù)中,則它就是局部變量,外部不能訪問:
def test():
msg_inner = 'ok'
# print(msg_inner) #報(bào)錯(cuò),無法訪問局部變量
運(yùn)行結(jié)果:
ok
2、作用域二
①、局部變量:定義在函數(shù)內(nèi)部的變量擁有一個(gè)局部作用域,局部變量只能在其被聲明的函數(shù)內(nèi)部訪問。
②、全局變量:定義在函數(shù)外的擁有全局作用域, 全局變量可以在整個(gè)程序范圍內(nèi)訪問。
③、調(diào)用函數(shù)時(shí),所有在函數(shù)內(nèi)聲明的變量名稱都將被加入到作用域中。
total = 0
def sumcopyt(arg1,arg2):
total= arg1+arg2
print("局部變量",total) # 結(jié)果是:3而不是0(以 L –> E –> G –>B 的先后規(guī)則查找)
return total
sumcopyt(1,2)
print('全局變量',total)
運(yùn)行結(jié)果:
局部變量 3
全局變量 0
3、作用域三
一個(gè)不在局部作用域里的變量默認(rèn)是只讀的,如果試圖為其綁定一個(gè)新的值,python認(rèn)為是在當(dāng)前的局部作用域里創(chuàng)建一個(gè)新的變量,也就是說在當(dāng)前局部作 用域中,如果直接使用外部作用域的變量,那么這個(gè)變量是只讀的,不能修改。
global:通過里面的操作,改變外面的值
name='50'
def change_name():
name='100'
print('局部變量的值:',name)
change_name()
print('全局變量的值:',name) #全局的變量,并沒有修改
print('--------------------------')
name2='50'
def change_name2():
#想讓局部的total和全局的total變?yōu)橥粋€(gè)total(通過里面的操作,改變外面的值)
global name2
name2='100'
print('局部變量的值:',name2)
change_name2()
print('全局變量的值:',name2) #全局的變量,已經(jīng)修改啦
運(yùn)行結(jié)果:
局部變量的值:100
全局變量的值:50
--------------------------
局部變量的值:100
全局變量的值:100
4、作用域四
如果要修改嵌套作用域即閉包函數(shù)(enclosing 作用域,外層非全局作用域)中的變量則需要nonlocal關(guān)鍵字
def method_01():
a = 1
def method_02():
nonlocal a
a=2
print(a)
method_02()
print(a)
method_01()
運(yùn)行結(jié)果:
2
2
三:Python內(nèi)置函數(shù)
為了提高程序員的開發(fā)效率,Python 提供了很多可以直接拿來用的函數(shù)。
內(nèi)容參考:http://www.runoob.com/python3/python3-built-in-functions.html
總結(jié)
以上是生活随笔為你收集整理的python基础语言法则_python语言基础3的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux python pymssql
- 下一篇: linux 配置DNS正反区域,Linu