一、參數類型
(一)形參與實參
- 要使用局部變量時,只能通過return的方式返回
def my(name): #函數體 return name my('lrx') #name是形參,lrx是實參
- 不寫返回值的時候,返回的是None
def db_connect(ip,port=3306): print(ip,port) res= db_connect('xxx.xx.xx.xx',3307) print(res) #結果: #xxx.xx.xx.xx 3307 #None
(二)參數類型
1、位置參數\形式參數
- 形式參數,也叫位置參數
- 是必傳參數
- 調用時如果不填實參會報錯
def my(name,sex): #name、sex是位置參數,調用時不填會報錯 return name my('lrx') #結果: #TypeError: my() missing 1 required positional argument
def db_connect(ip,user,password,db,port): pass db_connect(user='lrx',ip='xxx.xx.xx.xx',port=3306,db='my1',password='123456') db_connect('xx.xx.xx.xx','lrx',db='my1',password='123456',port=3306) db_connect(ip='xx.xx.xx.xx','lrx',password='123456',db='my1',port=3306) #這樣寫報錯 #位置參數在傳參時,如果開頭指定了xx=xx,后面必須都有使用這種格式;如果開頭沒有指定,就按默認順序傳值
- 給參數一個提醒類型:調用時可以傳入不同類型的參數,不受影響。
def my4(s:str,d:dict): #提示應該傳字符串類型和字典類型 print(s) print(d) my4(123,'sdf') #傳的是數字類型和字符串類型 #結果: #123 #sdf #結果不報錯,第一個是數字類型,第二個是字符串類型
2、默認值參數
- xxx=xxx的格式
- 是非必傳參數
- 調用時不填,就使用定義時的默認值
def db_connect(ip,port=3306): print(ip,port) db_connect('xxx.xx.xx.xx') #結果: #xxx.xx.xx.xx 3306
- 調用時填,就使用填的值
def db_connect(ip,port=3306): print(ip,port) db_connect('xxx.xx.xx.xx',3307) #結果: #xxx.xx.xx.xx 3307
3、可變參數
- 是非必傳參數
- 使用參數名前面加一個星號表示
- 它把傳入的元素都存到一個元組里
- 不限制傳入參數的個數
- 用在參數比較多的時候
def send_sms(*phone_num): #*phone_num:可變參數,參數組 print(phone_num) send_sms() send_sms('1') send_sms('1','2','3') #結果: # () # ('1',) # ('1', '2', '3')
- 通常使用args作為參數名
def send_sms(*args): #*args:可變參數,參數組 for p in args: print(p)
4、關鍵字參數
- 是非必傳參數
- 使用參數名前面加兩個星號表示
- 不限制傳參個數
- 它是把傳入的參數保存在一個字典里
- 如果傳參,必須要傳位置參數這種xx=xx的格式,否則報錯。
- 通常使用kwargs當做變量名。
def send_sms2(**kwargs): print(args) send_sms2() send_sms2(addr='sfsdf') send_sms2(name='xiaohei',sex='男') #結果: # {} # {'addr': 'sfsdf'} # {'name': 'xiaohei', 'sex': '男'}
5、參數組合使用
- 如果一個函數中必須要使用4中參數,那么一定要按照順序寫參數:
(1)位置參數(2)默認值參數(3)可變參數(4)關鍵字參數
def my(name,country='China',*args,**kwargs): print(name) print(country) print(args) print(kwargs) my('xiaojun') #結果: # xiaojun # China # () # {}
def my(name,country='China',*args,**kwargs): print(name) print(country) print(args) print(kwargs) my('xiaojun','Japan','beijing','天通苑',color='red',age=23) #結果: # xiaojun # Japan # ('beijing', '天通苑') # {'age': 23, 'color': 'red'}
def my(name,country='China',*args,**kwargs): print(name) print(country) print(args) print(kwargs) my('xiaojun') my('xiaojun','beijing','天通苑',color='red',age=23) #結果: # xiaojun # beijing # ('天通苑',) # {'age': 23, 'color': 'red'}
def my(name,country='China',*args,**kwargs): print(name) print(country) print(args) print(kwargs) my('xiaojun',country='beijing','天通苑',color='red',age=23) #不可以,報錯,因為傳入了位置參數,后面就不能再直接傳參了,也要使用xx=xx的格式
def my(name,country='China',*args,**kwargs): print(name) print(country) print(args) print(kwargs) my('xiaojun','beijing','天通苑',color='red',age=23,country='hh') #結果: #TypeError: my() got multiple values for argument 'country' #由於前面已經給默認值參數賦值為beijing了,后面再賦值,代碼就不知道該怎么辦了。
return的作用:
- 結束函數,只要函數里面遇到return就馬上結束。
- 返回函數的處理結果。
def my2(): for i in range(50): return i print(my2()) #結果: #0
變量賦值:
- 多變量賦值為數值,單變量賦函數值為元組:
def my3(): a=1 b=2 c=3 return a,b,c b,c,d=my3() print(b,c,d) s=my3() print(s) #結果: #1 2 3 #(1, 2, 3)
- 定義變量可以一起定義:
a,b,c=1,2,3
d=e=f=1
二、應用
1、操作文件:當不傳默認值時,讀文件,傳字典時,寫入json串。
import json def op_file_tojson(file_name,dic=None): if dic: with open(file_name,'w',encoding='utf-8') as f: json.dump(dic,f) else: f=open(file_name,encoding='utf-8') f.seek(0) content=f.read() if content: res=json.loads(content.strip()) else: res={} f.close() return res op_file_tojson('users.txt',{"abc":"123","sgds":"3434"}) print(op_file_tojson('users.txt')) #結果: #{'abc': '123', 'sgds': '3434'}
三、局部變量與全局變量
- 局部變量:只能在函數內部使用,如果外面想要使用,只能通過return的方式。
- 全局變量:在文件里都可以使用,如果函數內部沒有定義該變量,函數內部需要使用時就使用全局變量。
name='lrx' #全局變量 def get_name(): name='abc' print(name) get_name() #結果: #abc name='lrx' #全局變量 def get_name(): #name='abc' print(name) get_name() #結果: #lrx
- 想要修改全局變量,就要在變量前面先聲明一下,使用global關鍵字
- 只有string、int和元組才需要聲明
name='lrx' def get_name(): name='abc' print(name) get_name() print('函數外面的name',name) #結果: #abc #函數外面的name lrx name='lrx' def get_name(): global name name='abc' print(name) get_name() print('函數外面的name',name) #結果: #abc #函數外面的name abc
小練習:
name='lrx' def get_name(): global name name='abc' print('1、函數里面的name',name) def get_name2(): print('2、get_name2',name) get_name2() get_name() print('3、函數外面的name',name) #結果: #2、get_name2 lrx #1、函數里面的name abc #3、函數外面的name abc