一、参数类型
(一)形参与实参
- 要使用局部变量时,只能通过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