python调用ch_python基础--函数基础

函数

函数可以看成是工具(闲时造好,需要时调用)

注册函数实列:

def register():

"""注册功能"""

count = 0

while count < 3:

username_inp = input('请输入你的用户名:')

pwd_inp = input("请输入你的密码:")

re_pwd = input("请再次输入你的密码:")

if not pwd_inp == re_pwd_inp:

print('两次密码不一致')

count += 1

continue

with open('user_info.txt','a',encoding='utf8') as fa:

fa.write(f'{username_inp}:{pwd_inp}|')

# 用户名和密码用“:”隔开,用户和用户用"|"隔开

fa.flush()

break

登录函数实列:

def login():

"""登录功能"""

username_inp = input("请输入用户名:")

pwd_inp = input("请输入密码:")

with open('user_info.txt','r',encoding='utf8') as fr:

for user_info in fr:

username, pwd = user_info.split(':')

if username.strip() == username_inp and pwd.strip() == pwd_inp:

print('登录成功')

break

else:

continue # 一般不会把continue写在最后,在可以不用写

else:

print('登录失败')

注册函数和登录函数这就写好了,现在可以调用了

函数的调用

函数名+() 就能调用

register() # 调用注册函数

print(register.__doc__) # 打印注释

login() # 调用登录函数

print(login.__doc__) # 打印注释

# 然后点击运行就可以进行注册和登录步骤了

函数不会改变某个功能的代码,它只是对特定功能的代码进行封装(接口),只会让你的代码更加简洁而已.

'''

def 函数名(等同于变量名)():

"""对函数(工具)的描述信息""" # 这里加注释的好处是:可以把注释打印出来

代码块

'''

函数定义的特性:函数封装的是过程,只检测语法,不执行代码

函数的三种类型

空函数

def func():

pass

用于占位,后续有空再补充

有参函数

def guess(x,y):

"""给定两个数字,打印较大的数"""

if x > y:

print(x)

else:

print(y)

guess(23,32)

无参函数

def guess():

"""给定两个数字,打印较大的数"""

x = 20

y = 10

if x > y:

print(x)

else:

print(y)

函数的返回值

用 return 返回一个值,可以是所有数据类型

return 的特性

1、return 返回一个返回值,如果没有返回值,就返回None

2、没有return就默认返回None

3、return 会终止函数,不运行下面的代码,假设又多个return时,执行完第一个return就结束,不会执行后面的代码

4、return可以返回多个值,用逗号隔开,返回值以元组的形式接收

函数的参数

形参

位置形参:

从左到右依次接收实参的值

默认形参:

1、有默认值,如果调用传参了,使用新传的值;没有传参,使用默认值

2、默认形参必须得放在位置形参后面

实参

位置实参:

从左到右依次传值给形参

关键字实参

1、按照形参名传值

2、关键字实参必须得放在位置实参得后面

函数的参数尽量不超过三个

可变长参数

可变长参数:指的是在调用函数时,传入的参数个数可以不固定

调用函数时,传值的方式有两种,一种是位置实参,另一种是关键字实参,因此形参也必须得有两种解决方法,以此来分别接收溢出的位置实参(*)与关键字实参(**)

1、可变长形参*

形参中的 * 会将溢出的位置实参全部接收,然后存储元组的形式,然后把元组赋值给 * 后的参数。需要注意的是:* 后的参数名约定俗成为args。

def sum_self(*args):

res = 0

for num in args:

res += num

return res

res = sum_self(1,2,3,4)

print(res) # 打印结果为:10

2、可变长实参*

实参中的 * 星号会将其后的参数的值循环取出赋值给对应的位置形参。以后但凡碰到实参中带 * 的,它就是位置实参,应该马上打散成位置实参去看。

def func(x, y, z, *args):

print(x, y, z, args)

func(1, *(1, 2), 3, 4)

打印结果为:112(3,4)

3、可变长形参 **

形参中的 * * 会将溢出的关键字实参全部接收,然后存储字典的形式,然后把字典赋值给 ** 后的参数。需要注意的是: ** 后的参数名约定俗成为kwargs。

def func(**kwargw):

print(kwargw)

func(a=5)

打印结果为:{'a': 5}

4、可变长实参之**

实参中的 ** 两颗星号会将其后参数的值循环取出,打散成关键字实参。以后但凡碰到实参中带 ** 的,它就是关键字实参,应该马上打散成关键字实参去看。

def func(x, y, z, **kwargs):

print(x, y, z, kwargs)

func(1, 3, 4, **{'a': 1, 'b': 2})

打印结果为:1 3 4 {'a': 1, 'b': 2}

5、可变长参数应用

def index(name, age, sex):

print(f"name: {name}, age: {age}, sex: {sex}")

def wrapper(*args, **kwargs):

print(f"args: {args}")

print(f"kwargs: {kwargs}")

index(*args, **kwargs)

wrapper(name='nick', sex='male', age=19)

打印结果为:

args: ()

kwargs: {'name': 'nick', 'sex': 'male', 'age': 19}

name: nick, age: 19, sex: male

6、命名关键字形参

现在有一个需求:函数的使用者必须按照关键字实参传。

def register(x, y, **kwargs):

if 'name' not in kwargs or 'age' not in kwargs:

print('用户名和年龄必须使用关键字的形式传值')

return

print(kwargs['name'])

print(kwargs['age'])

register(1, 2, name='nick', age=19)

打印结果为:

nick

19

命名关键字形参:在函数定义阶段, * 星号后面的参数都是命名关键字参数

特点:在传值时,必须按照 “key=value” 的格式传值,并且key必须命名关键字参数的指定的参数名。

def register(x, y, *, name, gender='male', age):

print(x)

print(age)

register(1, 2, x='nick', age=19) # TypeError: register() got multiple values for argument 'x'

打印结果为: TypeError: register() got multiple values for argument 'x'

因为 x 被两次传值,这种情况是不被允许的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值