day14 函数

函数

  • ==函数只是一种思想,具体的实现都是靠if/while/for+变量,函数只是让你干活更轻松==

  • 代码的一种组织形式

  • 用来对一项特定的功能进行打包封装,方便以后重复使用

  • 把冗余的代码独立开

函数的使用

  • 定义函数:定义函数阶段只识别语法,不运行代码,所以即便里面本该报错的东西,也可能不会报错

  • 调用函数:调用函数才执行函数体代码

函数的定义

  • 函数名的规范和变量名相同
def 函数名():
    代码块  # 用来实现一个具体的功能
  • 定义函数
def register():
    username = input('请输入需要注册的用户名')
    userpwd = input('请输入密码')
    
    with open(r'userinfo.txt', mode='a', encoding='utf-8') as fa:
        fa.write(f'\n{username}:{userpwd}')

函数的调用

  • 函数名()即可
register()

函数文档

  • 函数的说明书
  • __doc__查看函数文档
def login():
    '''用户登录功能'''            # 可以用__doc__查看到的信息
    username = input('请输入你的帐号:').strip()
    userpwd = input('请输入你的密码:').strip()
    
    user_dict = dict()
    with open(r'userinfo.txt', mode='r', encoding='utf-8') as fr:
        for user in fr:
            user_list = user.strip().split(':')
            user_dict[user_list[0]] = user_list[1]
    if user_dict.get(username) == userpwd:
        print('登录成功')

        
login()

1.无参函数

def self_max():
    x, y = 10, 20
    if x > y:
        print(x)
    else:
        print(y)


self_sum()
20

2. 有参函数

  • 有几个参数,在调用时就必须传入几个参数
def sulf_max(x, y):
    if x > y:
        print(x)
    else:
        print(y)
        
sulf_sum(10, 20)
20

3. 空函数

  • 想做一件事,但是目前还没有具体的想法,就先留一个地方,以后再写
def self_max():
    pass

返回值

  1. 函数名可以看做变量名,那么变量名是用来接收变量值的,函数名则是用来接收返回值的
  2. 默认返回None
  3. 返回值可以是任何数据类型,当return为多个值的时候,会以元祖的形式包起来
  4. 一旦代码走到return,那么就会终止下面所有的代码,类似于循环中的break
def sulf_sum(x, y):
    if x > y:
        return x
    else:
        return y
        
result = sulf_sum(10, 20)
print(result)
20

函数对象

  • ==Python中一切皆对象==
def self_max(x, y):
    if x > y:
        return x
    else:
        return y
    
result = self_max(10, 100)
result += 100
print(result)
200
def max_4num(x, y, a, b):
    res1 = self_max(x, y)
    res2 = self_max(res1, a)
    # res3 = self_max(rel2, b)
    return self_max(res2, b)

result = max_4num(4, 7, 100, 69)
print(result)
100

参数

  1. 形参:在定义阶段的变量,被称之为形参,它具有描述意义,相当于变量名,不为具体的数据类型
  2. 实参:在调用阶段传入的参数,必须是具体的数据类型,相对而言类似于变量值,被形参接收
### 位置参数
def self_max(x, y):
    if x > y:
        return x  # 如果返回的是x,那么下面的也不会打印
    print(666)
    print(233)
    return y

    
x = 30
max_num = self_max(x, 20)
print(max_num)
30

默认参数

  • 在函数定义阶段,提前赋值给形参,在调用阶段可以不传入实参,但当实参传入值的时候,实参则会覆盖默认值
  • 必须在位置参数后面
def guess_age(age=18):
    inp_age = input('猜一个年龄:')
    
    if inp_age == age:
        print('猜对了')
    else:
        print('猜错了')
        

guess_age()
猜一个年龄:16
猜错了

关键字参数

  • 在函数调用阶段,找到与形参的对应位置,并赋值给相应的形参,必须与形参名相同,可以不管顺序
  • 必须在位置参数后面
def self_max(x, y):
    if x > y:
        return x
    else:
        return y
    
result = self_max(y=10, x=100)
print(result)
100

可变长参数(收集参数)

形参部分

  • *args 把这个列表/元祖内的元素一个一个取出来,然后一个一个传给函数(相当于解压缩)
  • **kwargs 会把字典打散成键值对的形式作为关键字实参传给函数

def self_max(a, b, c, d, e, f=6, g=7):
    print(a, b, c, d, e, f, g)
    

a = [1, 2, 3, 4, 5, 10]
self_max(*a)

a = [1, 2, 3, 4, 5]
b = {'f':30, 'g':100}
self_max(*a, **b)
1 2 3 4 5 10 7
1 2 3 4 5 30 100

实参部分

  • *args接受了所有的位置实参,然后以元祖的形式保存下来.只接受位置参数,不接受关键字参数.
  • **kwargs接受了所有的关键字实参,然后以字典的形式保存下来
def self_num(*args, **kwargs):
    print(args)
    print(kwargs)

self_num(1, 2, 3, 4, 5, f=6, g=7)
(1, 2, 3, 4, 5)
{'f': 6, 'g': 7}

约定俗成

  • *后面写args,**后面写kwargs,这是一种约定俗成的规范

收集参数混合调用的顺序问题

  • 收集参数,关键字参数,普通参数可以混合使用
  • 使用规则就是:普通参数和关键字参数优先,多余的参数打包
  • 定义的时候一般找普通参数,关键字参数,收集参数tuple,收集参数dict

函数的解包问题(了解)

def stu(*args):
    print("哈哈哈哈哈")
n 用来表示循环次数
    # 主要用来调试
    for i in args:
        print(i)
        print ("*" * 30)
        
l = ["liuying", 19, 23, "wangxiaojing"]
stu(l)
哈哈哈哈哈
['liuying', 19, 23, 'wangxiaojing']
******************************
  • 加一个星号
stu(*l)
哈哈哈哈哈
liuying
******************************
19
******************************
23
******************************
wangxiaojing
******************************
  • **kwargs也是一样,用**进行解包就可以了

函数中的知识大纲

# 函数的参数
# 函数的可变长参数
# 函数的返回值
# 函数的调用
# 迭代器,可迭代对象
# 生成器
# 递归
# 闭包
# 装饰器
# 面向对象编程
# 列表推到式/字典表达式
# 生成器生成式
# ATM雏形

猜你喜欢

转载自www.cnblogs.com/lucky75/p/10946408.html