zoukankan      html  css  js  c++  java
  • 7. 函数-自定义函数

    一、函数定义

    # 形参
    def func(a, b):
        c = a + b
        return c
    # 实参
    func(1, 2)
    

    二、实参分类

    1. 位置参数

    1. 位置参数,传递参数时,需要形参、实参对应
    
    def func(position1, position2):
        if position1 > position2:
            return position1
        else:
            return position2
    
    def func(postiont1, position2):
        # 三元运算符
        c = a if a > b else b
        return c
    

    2. 关键字参数

    def func(name, address, age):
        pass
    
    func(name='jone', age=18, address='北京')
    

    3. 混合参数

    注意: 在使⽤混合参数的时候, 关键字参数必须在位置参数后⾯
    

    三、形参分类

    1. 位置参数

    # 位置参数. 按照位置来赋值
    def func(name, address, age):
        pass
    

    2. 默认值参数

    # 在调⽤的时候可以给出具体的值, 也可以不给值, 使⽤默认值
    def func(name, age, sax='男'):
        pass
    

    4. *args

    # 动态接收位置参数
    
    def func(*args):
        # 以元组形式返回
        return args
    
    func(1, 2, 3)
    

    5. **kwargs

    # 动态接收关键字参数
    
    def func(**kwargs):
        # 以字典形式返回
        return kwargs
    
    func(a = 1, b = 2, c = 3)
    

    6. 动态传参的另一种方式

    def fun(*args):
    	print(args)
        
    lst = [1, 4, 7]
    # 可以使⽤*把⼀个列表按顺序打散
    fun(*lst) 
    
    s = "⾂妾做不到"
    # 字符串也可以打散, (可迭代对象)
    fun(*s) 
    
    def fun(**kwargs):
    	print(kwargs)
        
    dic = {'a':1, 'b':2}
    fun(**dic)
    

    7. 传参顺序

    位置参数 > *args > 默认值参数 > **kwargs 
    

    四、函数注释

    def chi(food, drink):
    """
    这⾥是函数的注释, 先写⼀下当前这个函数是⼲什么的, ⽐如我这个函数就是⼀个吃
    :param :param food: 参数food是什么意思
    :param :param drink: 参数drink是什么意思
    :return :return: 返回的是什么东东
    """
    	print(food, drink)
    	return "very good"
    

    五、命名空间

    1. 命名空间分类

    1. 全局命名空间--> 我们直接在py⽂件中, 函数外声明的变量都属于全局命名空间
    2. 局部命名空间--> 在函数中声明的变量会放在局部命名空间
    3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间
    

    2. 加载顺序

    1. 内置命名空间
    2. 全局命名空间
    3. 局部命名空间(函数被执⾏的时候)
    

    3. 取值顺序

    1. 局部命名空间
    2. 全局命名空间
    3. 内置命名空间
    

    4. globalnonlocal

    (1) global
    a = 100
    def func():
        # 加了个global表示不再局部创建这个变量了. ⽽是直接使⽤全局的a
    	global a 
    	a = 28
    	print(a)
        
    func()
    print(a)
    
    结果:28 28
    
    (5) nonlocal
    1. nonlocal 表⽰在局部作⽤域中, 调⽤⽗级命名空间中的变量
    
    a = 10
    def func1():
    	a = 20
        def func2():
            nonlocal a
            a = 30
            print(a)
        func2()
        print(a)
    func1()
    
    结果:
    加了nonlocal
    30
    30
    不加nonlocal
    30
    20
    

    六、总结return

    1. 遇到return. 此函数结束, 函数后⾯的东⻄将不会再执⾏
    2. return 返回值
    	如果return什么都不写 或者 ⼲脆不写return .那么返回的就是None
    	如果return后⾯写了⼀个值. 则调⽤者可以接收⼀个结果
    	如果return后⾯写了多个结果, 则调⽤者可以接收⼀个tuple, 调⽤者可以直接解构成多个变量
    

    七、例子

    1. 写函数,此函数只接收一个参数且此参数必须是列表数据类型
    # 此函数完成的功能是返回给调用者一个字典,此字典的键值对为此列表的索引及对应的元素。
    # 例如传入的列表为:[11,22,33] 返回的字典为 {0:11,1:22,2:33}。
    def func(lst):
        if type(lst) != list:
            print("扔出去一个异常")
    
        dic = {}
        for i in range(len(lst)):
            dic[i] = lst[i]
        return dic
    
    
    2. 写一个函数完成三次登陆功能,再写一个函数完成注册功能. 用户信息写入到文件中
    # 注册
    def regist(username, password): # wusir
        # 1. 检查用户名是否重复
        f = open("user_info", mode="r+", encoding="utf-8")
        for line in f:
            if line == "": # 防止空行影响程序运行
                continue
            user_info_username = line.split("_")[0]
            if username == user_info_username: # 用户名重复了
                return False
        else:
            # 2. 写入到文件中
            f.write(username+"_"+password+"
    ")
    
        f.flush()
        f.close()
        return True
    
    name, psw = input("请输入你的用户名:"), input("请输入你的密码:")
    print(regist(name, psw))
    
    # 登录
    def login(username, password):
        f = open("user_info", mode="r", encoding="UTF-8")
        for line in f:
            if line.strip() == username+"_"+password:
                f.close()
                return True
        else:
            f.close()
            return False
    
    for i in range(2, -1, -1):
        ret = login(input("请输入用户名:"), input("请输入密码:"))
        if ret:
            print("恭喜你. 登录成功")
            break
        else:
            print("用户名或密码错误, 还有%s次机会" % i)
          
        
    3. 写函数,传入函数中多个实参(均为可迭代对象如字符串,列表,元祖,集合等),
    # 将每个实参的每个元素依次添加到函数的动态参数args里面.
    # 例如 传入函数两个参数[1,2,3] (22,33)最终args为(1,2,3,22,33)
    def func(*args): # str, list, tuple, set
        print(args)
        lst = []
        for el in args:
            for e in el:
                lst.append(e)
        tu = tuple(lst)
        print(tu)
    
    func(*"哈哈", *[1,3,5], *(456,789))
    
  • 相关阅读:
    。。。
    __new__ 单例
    bokeh
    空间数据可视化
    关系网络图
    Pandas 50题练习
    seaborn
    数据输出及内容美化 简单介绍
    数据分析---项目总结
    数学建模
  • 原文地址:https://www.cnblogs.com/hq82/p/11481400.html
Copyright © 2011-2022 走看看