• Python之参数类型、变量


    一、参数类型

    (一)形参与实参

    • 要使用局部变量时,只能通过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
  • 相关阅读:
    第六章 编译并运行程序
    第五章 顺序型编程进阶
    第四章 异常
    第三章 顺序型编程
    TCP和UDP的区别和优缺点
    Java UDP Socket编程
    springboot 学习资源推荐
    springboot集成redis
    微信公众号的SpringBoot+Quartz的定时任务Demo
    远程桌面发生身份验证错误,要求的函数不受支持【WIN10家庭】或【专业版】--解决办法
  • 原文地址:https://www.cnblogs.com/yanwuliu/p/10023066.html
Copyright © 2020-2023  润新知