函数参数与函数文档

四类参数?

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

关键字参数?

  • 语法

      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

函数参数与函数文档的相关文章

函数参数、函数嵌套、作用域、名称空间

一.函数参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解. Python的函数定义非常简单,但灵活度却非常大.除了正常定义的必选参数外,还可以使用默认参数.可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码. 1.位置参数 我们先写一个计算x2的函数: def power(x): return x *

JavaScript进阶系列01,函数的声明,函数参数,函数闭包

本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调用我"); } 通过这种方式声明的函数属于Window对象,可以在任何地方调用,即在doSth方法的之前和之后都可以调用. 可以在doSth方法之前调用: doSth(); function doSth() { alert("可以在任何时候调用我"); } 可以在doSth方法之

Golang中interface{}作为函数参数和函数返回值的使用

package main import (     "errors"     "fmt" ) type item struct {     Name string } func (i item) String() string {     return fmt.Sprintf("item name: %v", i.Name) } type person struct {     Name string     Sex  string } func

3203 数组做函数参数----排序函数--C语言版

3203: 数组做函数参数----排序函数--C语言版 时间限制: 1 Sec  内存限制: 128 MB提交: 253  解决: 151[提交][状态][讨论版][命题人:smallgyy] 题目描述 定义一个函数来完成对参数数组中元素的排序工作,函数声明如下: void sort(int array[ ]);//该函数完成对array数组的排序工作 在以下程序的基础上,完成对sort函数的定义,提交时,只提交sort函数的定义即可. #include <stdio.h> void sort

3204: 数组做函数参数--排序函数2--C语言

3204: 数组做函数参数--排序函数2--C语言 时间限制: 1 Sec  内存限制: 128 MB提交: 211  解决: 143[提交][状态][讨论版][命题人:smallgyy] 题目描述 定义一个函数来完成对参数数组中元素的排序工作,函数声明如下: void sort(int array[ ],int n);//该函数完成对array数组的前n个元素的排序工作 在以下程序的基础上,完成对sort函数的定义,提交时,只提交sort函数的定义即可. #include <stdio.h >

关于JQ的$.deferred函数。参考网络文档

由于jQuery版本问题对Deferred对象的实现有所不同,具体请参照jQuery api: jQuery.Deferred()基于Promises/A规范实现,因为jQuery本身的设计风格,jQuery.Deferred()并没有完全遵循Promises/A规范. jQuery在1.5版本中首次引入了Deferred.你可以通过jQuery.Deferred() 在未来某个时候 得到 ‘延时’返回值. 在此之前是无法单独使用的,Deferred作为对ajax模块较大重写的一部分添加进来.1

对象做函数参数和函数返回值时,调用复制构造函数,构造函数,析构函数的情况

// 对象做函数参数和返回值.cpp : 定义控制台应用程序的入口点.//exit(0)表示正常退出程序,exit(0)表示异常退出 //在调用input时,编译器用对象A去创建了形参对象temp,调用了复制构造函数,对象A中的数据复制给了对象temp// 在input函数中,执行temp.set(s),为对象temp中数据成员str申请了动态储存空间,并设置了输入的字符串//并没有改变实参A中的数据成员str的储存空间,故在执行语句A.show()后输出的字符串并没有改变.在函数调用结束后 /

WebService 实现BS环境与BS环境传递参数,根据参数生成txt文档

客户端: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Client.aspx.cs" Inherits="客户端.Client" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"><head runat="ser

JS 函数参数 及 函数数组

<script> function a(){ alert("a"); } function b(){ alert("b"); } var arr = []; function addEvent(o,f){ o.blur=f(); var n = arr.length; while(n--){ if(arr[n]==f) return; } arr.push(f); } function Run(){ for(var i=0;i<arr.length