四类参数?
- 普通参数
- 默认参数
- 关键字参数
- 收集参数
关键字参数?
- 语法
def func(p1=v1, p2=v2....): func_body
调用函数:
func(p1=value1,p2=calue2......)
- 比较麻烦,但也有好处
- 不容易混淆,一般实参和形参只是按位置一一对应即可,容易出错
- 使用关键字参数,可以不考虑参数位置
In [4]:
?x
# 关键字参数案例
def stu(name, age, addr):
print("I am a student")
print("我叫 {0}, 我今年 {1}岁了, 我住{2}".format(name, age, addr))
n = "ruirui"
a = 20
addr = "宿舍"
?
# 普通参数,只是按照位置传递,容易出错
stu(n, a, addr)
I am a student 我叫 ruirui, 我今年 20岁了, 我住宿舍
. . .
In [6]:
def stu_key(name="No name", age=0, addr="No addr"):
print("I am a student")
print("我叫 {0}, 我今年 {1}岁了, 我住{2}".format(name, age, addr))
n = "ruirui"
a = 20
addr = "宿舍"
?
# 关键字参数,按名字传递,不会出错
stu_key(name=n, age=a, addr=addr)
I am a student 我叫 ruirui, 我今年 20岁了, 我住宿舍
. . .
## 收集参数
- 把没有位置, 不能和定义时的参数位置相对应的参数,放入一个特定的数据结构里去
- 语法
def func(*args)
func_body
按照 list 使用方式访问 args 得到传入的参数
调用:
func(p1, p2, p3,.......)
- 参数名 args 不是必须这样写,但是,我们推荐直接用 args ,约定俗成
- 参数名 args 前面必须有星号 *
- 收集参数可以和其他参数共存
收集参数?
- 把没有位置, 不能和定义时的参数位置相对应的参数,放入一个特定的数据结构里去
- 语法
def func(*args) func_body 按照 list 使用方式访问 args 得到传入的参数 调用: func(p1, p2, p3,.......)
- 参数名 args 不是必须这样写,但是,我们推荐直接用 args ,约定俗成
- 参数名 args 前面必须有星号 *
- 收集参数可以和其他参数共存
In [12]:
# 收集参数代码
# 函数模拟一个学生进行自我介绍,但具体内容不清楚
# args 把它看作一个 list
def stu(*args):
print("Hello 大家好, 我先自我介绍下:")
# type 函数作用是检测变量的类型
print(type(args))
for item in args:
print(item)
stu("ruirui", 20, "青岛大学","jianjain", "single" )
stu("大锤")
Hello 大家好, 我先自我介绍下: <class ‘tuple‘> ruirui 20 青岛大学 jianjain single Hello 大家好, 我先自我介绍下: <class ‘tuple‘> 大锤
. . .
In [13]:
# 收集参数案例
# 说明收集参数可以不带任何实参调用,此时收集参数为空 tuple
stu()
Hello 大家好, 我先自我介绍下: <class ‘tuple‘>
. . .
In [14]:
# 如果使用关键字参数调用,会出问题
stu(name="Liuying")
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-14-9c9c0b11e172> in <module>() 1 # 如果使用关键字参数调用,会出问题 ----> 2 stu(name="Liuying") TypeError: stu() got an unexpected keyword argument ‘name‘
. . .
## 收集参数之关键字收集参数
- 把关键字参数按字典格式嵌入收集参数
- 语法
def func(**kwargs):
func_body
# 调用:
func(p1=v1, p2=v2, p3=v3,.....)
- kwargd 一般的约定俗成
- 调用的时候,把多余的关键字参数嵌入 kwargs
- 访问 kwargs 需要按字典的格式访问
收集参数之关键字收集参数?
- 把关键字参数按字典格式嵌入收集参数
- 语法
def func(**kwargs):
func_body
# 调用:
func(p1=v1, p2=v2, p3=v3,.....)
- kwargd 一般的约定俗成
- 调用的时候,把多余的关键字参数嵌入 kwargs
- 访问 kwargs 需要按字典的格式访问
In [21]:
# 收集参数关键字参数案例
# 自我介绍
# 调用的时候需要使用关键字参数调用
def stu( **kwargs):
print("Hello 大家好, 我先自我介绍下:")
print(type(kwargs))
# 关于字典的访问 python2 和 python3 是有区别的
for k,v in kwargs.items():
print(k, "....", v) # k 表示变量名称 引号里面表示字符串,v 表示给变量赋的值
stu(name="jianjian", age=20, addr="青岛大学", love="ruirui", work="自由")
print("*"*20)
stu(name="大锤")
Hello 大家好, 我先自我介绍下: <class ‘dict‘> name .... jianjian age .... 20 addr .... 青岛大学 love .... ruirui work .... 自由 ******************** Hello 大家好, 我先自我介绍下: <class ‘dict‘> name .... 大锤
. . .
In [22]:
# 收集参数可以为空的案例
stu()
Hello 大家好, 我先自我介绍下: <class ‘dict‘>
. . .
### 收集参数混合调用得顺序问题
- 收集参数,关键字参数,普通参数可以混合使用得
- 使用参数规则就是,普通参数和关键字参数优先
- 定义得时候一般找普通参数,关键字参数,收集参数 tuple ,收集参数 dict
收集参数混合调用得顺序问题?
- 收集参数,关键字参数,普通参数可以混合使用得
- 使用参数规则就是,普通参数和关键字参数优先
- 定义得时候一般找普通参数,关键字参数,收集参数 tuple ,收集参数 dict
In [44]:
# 收集参数混合使用案例
# stu 模拟一个学生得自我介绍
def stu(name, age, *args, hobby="没有",**kwargs):
print("Hello 大家好")
print("我叫{0},今年{1}了。".format(name, age))
if hobby =="没有":
print("我没有特殊的爱好,so sorry")
else:
print("我的爱好是{0}".format(hobby))
print("*" * 20)
for i in args:
print(i)
for k,v in kwargs.items():
print(k, "...", v)
# 开始调用函数
name = "jianjian"
age = 20
# 调用不同得格式
stu(name, age)
?
stu(name, age, hobby="吃")
?
stu(name, age, "ruirui", hobby="聊天", hobby1="烹饪")
Hello 大家好 我叫jianjian,今年20了。 我没有特殊的爱好,so sorry ******************** Hello 大家好 我叫jianjian,今年20了。 我的爱好是吃 ******************** Hello 大家好 我叫jianjian,今年20了。 我的爱好是聊天 ******************** ruirui hobby1 ... 烹饪
. . .
## 收集参数得解包问题
?
- 把参数嵌入 list 或字典里,直接把 lisr/dict 中得值放入收集参数中
- 语法:参见案例
收集参数得解包问题?
- 把参数嵌入 list 或字典里,直接把 lisr/dict 中得值放入收集参数中
- 语法:参见案例
In [51]:
# 收集参数得解包问题
def stu(*args):
print("我笑了")
# n 用来表示循环次数
# 主要用来调试
n = 0
for i in args:
print(type(i))
print(n)
n += 1
print(i)
#stu("jianjian", "ruirui", 20, 19)
?
l = ("jianjian", "ruirui", 20, 19)
l = list()
l.append("jianjian")
l.append(20)
l.append(19)
?
stu(l)
# 此时,args 得表示形式是字典内一个 List 类型得元素, 即 arg = ({jianjian", "ruirui", 20, 19})
#很显然跟我们违背了最初得想法
?
?
# 此时得调用,我们就需要解包符号,即调用得时候前面加个星号 *
stu(*l)
我笑了 <class ‘list‘> 0 [‘jianjian‘, 20, 19] 我笑了 <class ‘str‘> 0 jianjian <class ‘int‘> 1 20 <class ‘int‘> 2 19
. . .
# 同理,dict 类型收集参数一样可以解包,但是
- 对 dict 类型进行解包
- 需要两个星号进行解包(**)
同理,dict 类型收集参数一样可以解包,但是?
- 对 dict 类型进行解包
- 需要两个星号进行解包(**)
## 返回值
- 函数和过程得区别
- 有无返回值
- 需要用 relum 显示返回内容
- 如果没有返回,则默认返回 None
- 推荐写法,无论有无返回值最后都要以 return 结束
返回值?
- 函数和过程得区别
- 有无返回值
- 需要用 relum 显示返回内容
- 如果没有返回,则默认返回 None
- 推荐写法,无论有无返回值最后都要以 return 结束
- 有无返回值
In [3]:
# 返回值示例
?
def func_1():
print("有返回值得")
return 1
def func_2():
print("没有返回值得")
f1 = func_1()
print(f1)
?
f2 = func_2()
print(f2)
有返回值得 1 没有返回值得 None
. . .
# 函数文档
?
- 函数得文档得作用是对当前函数提供使用相关参数信息
- 文档得写法
- 在函数内部开始得第一行使用三字符串定义符
- 一般具有特定格式
- 参看案例
- 文档查看
- 使用 help 函数, 形如 help(func)
- 使用 __doc__ ,参看案例(doc两边各两个下划线)
函数文档?
- 函数得文档得作用是对当前函数提供使用相关参数信息
- 文档得写法
- 在函数内部开始得第一行使用三字符串定义符
- 一般具有特定格式
- 参看案例
- 文档查看
- 使用 help 函数, 形如 help(func)
- 使用 doc ,参看案例(doc两边各两个下划线)
In [19]:
# 文档案例
# 函数 stu 是模拟一个学生得自我介绍得内容
def stu(name, age, *args):
"""
第一个
第二个
这是一个文档
"""
print("This is shanshu stu")
. . .
In [20]:
# 查看文档
help(stu)
stu.__doc__
Help on function stu in module __main__: stu(name, age, *args) 第一个 第二个 这是一个文档
Out[20]:
‘\n 第一个\n 第二个\n 这是一个文档\n \n ‘
. . .
In [1]:
def stu(name, age):
"""
这是文档内容
:param name:表示学生姓名
:param age:表示学生年龄
:return:此函数没有返回值
"""
pass
print(help(stu))
print("*" * 20)
print(stu.__doc__)
Help on function stu in module __main__: stu(name, age) 这是文档内容 :param name:表示学生姓名 :param age:表示学生年龄 :return:此函数没有返回值 None ******************** 这是文档内容 :param name:表示学生姓名 :param age:表示学生年龄 :return:此函数没有返回值
原文地址:https://www.cnblogs.com/yuanjian6/p/9702900.html
时间: 2024-11-08 14:24:32