函数参数与函数文档

四类参数

  • 普通参数
  • 默认参数
  • 关键字参数
  • 收集参数

关键字参数

  • 语法

      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:此函数没有返回值

posted on 2018-09-25 19:30  Nicktm  阅读(271)  评论(0编辑  收藏  举报

导航