yiruliu

一、参数类型

(一)形参与实参

  • 要使用局部变量时,只能通过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

 

分类:

技术点:

相关文章:

  • 2021-11-30
  • 2021-09-27
  • 2021-12-11
  • 2021-10-06
  • 2018-07-25
  • 2021-08-04
  • 2021-11-16
  • 2021-11-05
猜你喜欢
  • 2021-09-27
  • 2021-11-16
  • 2022-01-03
  • 2021-04-01
  • 2021-04-02
  • 2019-01-11
  • 2021-08-05
相关资源
相似解决方案