python程序设计——函数设计与调用
一、函數定義與調用
def 函數名([參數列表]):'''注釋'''函數體?
# 輸出小于n的斐波那契數 >>def fib(n):a,b=1,1while a < n:print(a,end=' ')a,b=b,a+bprint()>>fib(3) 1 1 2?
二、形參與實參
在絕大多數情況下,在函數內部直接修改形參的值不會影響實參
def addOne(a):print(a)a+=1print(a)>>a=3 >>addOne(a) 3 4>>a 3修改函數參數值的方式:
如果傳遞給函數的是可變序列,
并且在函數內部使用下標或其他方式為課表序列增加、刪除、修改元素值時,
修改后的結果可以反映到函數之外,即實參得到相應修改
# 修改列表元素的值def modify(v):v[0] = v[0] + 1>>a=[2] >>print(a) [2] >>modify(a) >>print(a) [3] # 為列表增加元素 def addList(v,item):v.append(item)>>a=[2] >>addList(a,3) >>print(a) [2,3]
三、參數類型
python函數參數主要分為:普通參數、默認值參數、關鍵參數、可變長度參數等
在定義函數時不需要指定參數的類型,形參類型由實參類型以及python解釋器的理解和推斷決定
同樣,不需要指定函數的返回值類型,由return語句返回值的類型決定
缺少return語句或沒有執行return語句時,默認返回空值None
1. 默認值參數
調用帶有默認值的函數時,可以不對默認值參數賦值,也可以通過顯示賦值來替換其默認值
在定義帶有默認值的函數時,默認值參數必須出現在函數形參列表的最右端,且任何一個默認值參數右邊都不能再出現非默認值參數
def 函數名(..., 形參名=默認值 ):函數體def say(message, time=1):print((message+' ')*times)>>say.__defaults__
(1,)
?
2.關鍵參數
指調用函數時的參數傳遞方式,而與函數定義無關
通過關鍵參數可以按名字傳遞值,實參順序可以和形參不一致
?
def demo(a,b,c=5):print(a,b,c)>>demo(3,7) 3 7 5>>demo(c=8,a=9,b=0) 9 0 8?
3.可變長度參數
*parameter 用來接收任意多個實參并將其放在一個元組中
**parameter 用來接收類似于關鍵參數一樣顯示賦值形式的多個實參并將其放入字典中
?
def demo(*P):print(P)# 將實參放入元組 >>demo(1,2,3) (1,2,3)# 在調用函數時,自動將接收參數轉換為字典 def demo(**p):for item in p.items():print(item)>>demo(x=1,y=2,z=3) ('x', 1) ('y', 2) ('z', 3)?
4.參數傳遞時的序列解包
可以使用列表、元組、集合、字典及其他可迭代對象作為實參,
并在實參名稱前加一個星號,解釋器自動進行解包,并傳遞給多個單變量形參
要保證實參中元素個數與形參個數相等
?
def demo(a,b,c):print(a+b+c)>>seq = [1,2,3] >>demo(*seq) 6# 字典型,默認按照鍵解包 >>dic={1:'a',2:'b',3:'c'} >>demo(*dic) 6# 指定按照值解包 >>demo(*dic.values()) abc?
四、變量作用域
函數內部定義的變量一般為局部變量,不屬于任何函數的變量一般為全局變量
應盡量避免使用全局變量,引用速度慢,增加不同函數之間的隱式耦合度
如果想在函數內部修改一個定義在函數外的變量值,那么這個變量就不能是局部的
?
def demo():global x # 聲明全局變量x=3 # 修改全局變量的值y=4 # 局部變量print(x,y)x=5 # 在函數外定義全局變量 demo() # 調用函數,修改全局變量的值 print(x) out: 5print(y) # 函數結束后,局部變量自動刪除 out: NameError: name 'y' is not defineddel x # 刪除全局變量不同模塊間共享全局變量,定義單獨的模塊,傳遞全局變量
# 定義模塊 A.py global_var = 0# 在模塊 B.py中 import A A.global_var = 1# 在模塊C.py中 import A A.global_var = 2?函數實例:
1、編寫函數,接收字符串參數,返回一個元組,其中第一個元素為大寫字母個數,第二個為小寫字母個數
?
def countStr(s):result = [0,0]for ch in s:if 'a'<= ch <= 'z':result[1] += 1elif 'A' <= ch <= 'Z':result[0] += 1return resulttmpStr = 'abANV' bigN,littleN = countStr(tmpStr) print(bigN,littleN)out: 3 22、編寫函數,接收一個所有元素值互不相等的整數列表x和一個整數n,要求將值為n的元素作為支點,
將列表中所有小于n的元素全部放在n的前面,所有值大于n的元素放在n后面
1 import random 2 def sortN(x,n): 3 if n not in x: 4 print(n,' is not an element of ',x) 5 return 6 7 i = x.index(n) # 獲取指定元素在列表中的索引 8 x[0],x[i] = x[i],x[0] # 與第0個元素交換 9 key = x[0] 10 11 i = 0 12 j = len(x)-1 13 while i<j: 14 while i < j and x[j] >= key: 15 j-=1 16 x[i]=x[j] # 從后向前找第一個比指定元素小的元素 17 18 while i < j and x[i] <= key: 19 i+=1 20 x[j]=x[i] # 從前向后找第一個比指定元素小的元素 21 22 x[i] = key 23 24 return x 1 x=list(range(1,10)) 2 random.shuffle(x) 3 print(x) 4 sortN(x,4) 5 print(x)?
轉載于:https://www.cnblogs.com/feinaio2017/p/8799216.html
總結
以上是生活随笔為你收集整理的python程序设计——函数设计与调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: k8s nodeport下访问请求未被分
- 下一篇: python爬取图片简记