Python 4.函数参数 返回值与文档查看(基础篇)

Stella981
• 阅读 451
  • 本章大纲:(以后文笔格式都会在开头有个大纲)
  • -五大参数-
  • 普通参数
  • 默认参数
  • 关键字参数
  • 收集参数
  • 收集参数解包问题
  • 关键字收集参数
  • 关键字收集参数解包问题
  • -返回值-
  • -文档查看-

 -普通参数-
  • 普通参数又名为位置参数,没有默认值,根据具体使用位置进行传值

  • 普通参数和默认参数的不同

  • 普通参数就是如同名字一般普通,没有默认值

  • 而默认参数则可以规定默认值(也就是规定了默认值的普通参数而已)

  • 但是默认参数要牢记一点:默认参数必须指向不变的对象值

  • 请看下面例子

    def add_end(L=[]): L.append('END') # 这里已经添加了一个END return L

    正常调用

    print (add_end([1,2,3])) # [1, 2, 3, 'END']

    使用默认参数调用时,一开始也是对的,但是再次调用时,结果就不一样了

    print (add_end()) # ['END']

    print(add_end()) # ['END', 'END']

    print(add_end()) # ['END', 'END', 'END']

     结果如下:

    [1, 2, 3, 'END'] ['END'] ['END', 'END'] ['END', 'END', 'END']

    也就是说赋值给默认参数的对象应该为常量 如果需要修改正确,则需要判断传入时参数是否为空

    def add_end2(L=None): if L is None: # 这里的is是身份函数的一种,请翻回上一篇“变量”文章 L=[] L.append('END') return Lprint(add_end2())

     结果如下:

    ['END'] # 也跟我们预期的结果一致


 -关键字参数-
  • 语法

  • def func(p1=v1,p2=v2):

  • 语句1

  • 语句2

  • ........

  • 调用函数:

  • func(p1=value1,p2=value2)

  • 好处:不容易混淆。一般实参和形参只是按照位置,一一对应即可,容易出错,使用关键字参数,可以不考虑参数位置

  • 坏处:比较麻烦

    案例如下: 案例条件:打印基本信息

    def stu(name,age,addr): print("我是{0},我今年{1},我住在{2}".format(name,age,addr)) #定义参数值 n = "zhansan" a = 18 addr = "广州" #普通参数传递,只按照位置传递,容易出错 stu(a,n,addr) #关键字传递,虽然麻烦,但是不容易出错 stu(age=a, name=n, addr=addr)

     结果如下:

    我是18,我今年zhansan,我住在广州 我是zhansan,我今年18,我住在广州


 -收集参数-
  • 把没有位置,不能和定义时的参数位置相对应的参数,放入一个特定的数据结构(tuple)中

  • 语法

  • def func(*args):

  • func_body

  • 按照tuple使用方式访问args得到传入的参数

  • 调用:

  • func(p1, p2, p3, .....)

  • 参数名args不是必须怎么写的,但是推荐使用(约定俗称)

  • 收集参数参数名前需要带有星号(*)

  • 收集参数可以和其他参数共存,事实上全部类型参数都可以同时出现在同一个函数里面

    案例如下 案例条件:函数模拟学生自我介绍,但是并不是每个学生都有相同的喜好,有的多,有的少

  1. 把收集参数看作一个tuple

  2. type为查看内容的类型

  3. type语法: type(args) args=需要查询的内容

    def stu(*args): print("hello,大家好,我先做下自我介绍:") print(type(args)) #查看args(收集参数)的类型 for item in args: #因为收集函数是一个tuple,所以使用循环将其全部打印 print(item) 调用收集参数

    #有同学介绍内容多 stu("zhangsan",18,"广州","篮球","游戏") #有同学介绍内容不多 stu("lisi") # 即便只有一个值也使用tuple进行收集 #收集的内容也能为空 stu()

     结果如下:

    hello,大家好,我先做下自我介绍: <class 'tuple'> zhangsan 18 广州 篮球 游戏 hello,大家好,我先做下自我介绍: <class 'tuple'> lisi hello,大家好,我先做下自我介绍: <class 'tuple'>

    使用关键字参数的格式进行调用收集参数 例如:调用时候 stu(name="wangwu",我们自己知道name是收集参数里面的那个值,但是系统不知道啊,系统直接当成是一个str类型的同一个变量而已,所以我们就要使用关键字收集参数


-关键字收集参数-
  • 把关键字参数按字典(dict)格式存入收集参数

  • 语法

  • def func(**kwargs): 注意是双(*)星号

  • func_body

  • 调用:

  • func(p1=v1, p2=v2, p3=v3........)

  • kwargs也是约定俗成

  • 调用的时候,把多余的关键字参数放入kwargs

  • 访问kwargs需要按字典格式访问

    案例如下 案例条件:同上自我介绍

  1. 调用的时候需要使用关键字参数格式调用

  2. dict里面的items方法返回列表里面可遍历的元素数组

    def stu(*kwargs): print("hello,大家好,我先做下自我介绍:") print(type(kwargs)) #查看收集关键字参数的类型 for k,v in kwargs.items(): #有两个变量进行循环原因是,不仅仅需要打印参数的值,连同关键字参数的参数名也要打印 print(k+"---"+v) #使用---将其分割开来,好看清楚 stu(name="zhangsan",age="18",addr="广州",lover="游戏",lovers="篮球") print("分割线"+""*20) stu(name="wangwu")

     结果如下:

    hello,大家好,我先做下自我介绍: <class 'dict'> name---zhangsan age---18 addr---广州 lover---游戏 lovers---篮球 分割线******************** hello,大家好,我先做下自我介绍: <class 'dict'> name---wangwu


 关于各类参数调用的顺序问题
  1. 之前就说过,收集参数,关键字参数,普通参数,默认参数,关键字收集参数

  2. 使用规则:普通参数,默认参数,收集参数,收集关键字参数

    混合参数使用案例

    def stu(name,age,hobby="没有",*args,kwargs): #name,age=位置参数,hobby=默认参数,*args=收集参数,kwargs=收集关键字参数 print("大家好,我再次介绍一下自己") print("我叫{0},今年{1}".format(name,age)) if hobby == "没有": print("对不起,我莫的爱好") else: print("我的爱好是{0}".format(hobby)) for i in args: print("我住在{0}".format(i)) for k,v in kwargs.items(): print("我还有爱好{0}".format(v)) 开始调用

    name = "zhansan" age = 18 #示范三种不同的调用方法 stu(name,age) stu(name,age,hobby="游戏") stu(name,age,"广州","萝岗区",hobby2="游戏",hobby3="篮球")

     结果如下:

    大家好,我再次介绍一下自己 我叫zhansan,今年18 对不起,我莫的爱好 大家好,我再次介绍一下自己 我叫zhansan,今年18 我的爱好是游戏 大家好,我再次介绍一下自己 我叫zhansan,今年18 我的爱好是广州 我住在萝岗区 我还有爱好游戏 我还有爱好篮球


 -收集参数的解包问题-
  1. 把收集参数当作一个list或者tuple,拆分成一个一个值,而不是再把它当作一个整体

  2. 使用一个星号(*args)进行解包

    解包案例如下

    def stu(*args): print("哇哈哈哈") #这里声明一个对象来查看,到底遍历了多少次收集参数 n = 0 print(type(args)) for i in args: print(type(i))# 打印args列表里内容的类型 print(n) n += 1 print(i) l = ["zhangsan",19,23,"lisi"] #解包=将元祖或列表转化为字符串的过程呈现 stu(*l) l2 = ("zhangsan",19,23,"lisi") stu(*l2) 

     结果如下:

    哇哈哈哈 <class 'tuple'> <class 'str'> 0 zhangsan <class 'int'> 1 19 <class 'int'> 2 23 <class 'str'> 3 lisi 哇哈哈哈 <class 'tuple'> <class 'str'> 0 zhangsan <class 'int'> 1 19 <class 'int'> 2 23 <class 'str'> 3 lisi


 -收集关键字参数的解包问题-
  1. 对dict类型进行解包

  2. 需要使用两个星号(**args)进行解包

    解包案例如下

    def stu(**kwargs): n = 0; print(type(kwargs)) for k,v in kwargs.items(): print(type(v)) print(n) n += 1 print(k+"---"+v) l1={'name':'zhangsan','age':"12",'names':'lisi','ages':'23'}# 定义字典 stu(**l1)

     结果如下:

    <class 'dict'> <class 'str'> 0 name---zhangsan <class 'str'> 1 age---12 <class 'str'> 2 names---lisi <class 'str'> 3 ages---23


 -返回值-
  • 函数和过程的区别,就是有无返回值

  • 需要使用return函数返回内容

  • 如果没有返回,则默认返回None

  • 推荐写法,无论有无返回值,最后都以return结束(毕竟可以None)

    返回值案例:有无返回值赋值的区别

    def func_1(): print("有返回值") return 1 def func_2(): print("无返回值") f1 = func_1() print(f1)

    f2 = func_2() print(f2) # 在无返回值的情况下,系统默认返回None

     结果如下:

    有返回值 1 无返回值 None


 -函数文档-
  • 函数的文档的作用是对当前函数提供使用相关的参考信息
  • 文档的写法:
  • 在函数内部开始的第一行使用三引号(''' ''',""" """)字符串定义符
  • 必须在函数的首行,经过验证前面有注释性说明是可以的,不过最好函数文档出现在首行
  • 具体格式:
  1. 第一行:函数名称
  2. 第二行:函数具体功能
  3. 第三行:参数名称以及内容
  4. 第四行:是否有返回值
  • 文档查看:

  • 是固体不过help函数,形如 help(func)

  • 使用doc

  • help和doc的区别:help的文档查看带有返回值

    文档写法案例如下 案例条件:介绍文档内容

    def stu(name=10,age=10): # 文档会自动帮我们打印参数信息 ''' 这是我的文档内容 :param name: :param age: :return: ''' print("函数调用成功")# 测试函数是否能成功调用 stu()

    使用help文档查看案例

    print(help(stu))

     结果如下:

    函数调用成功 Help on function stu in module main:

    stu(name=10, age=10) 这是我的文档内容 :param name: :param age: :return: None

    使用doc文档查看案例

    print(stu.doc)

     结果如下:

    函数调用成功

    这是我的文档内容
    :param name:
    :param age:
    :return:
    

    使用doc查询文档并不会出现返回值

文笔不好,仅供参考

要有错误或者有其他更多的见解,欢迎大家加我QQ384435742来交流

想第一时间看更新的文章,请关注,谢谢

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
thinkcmf+jsapi 实现微信支付
首先从小程序端接收订单号、金额等参数,然后后台进行统一下单,把微信支付的订单号返回,在把订单号发送给前台,前台拉起支付,返回参数后更改支付状态。。。回调publicfunctionnotify(){$wechatDb::name('wechat')where('status',1)find();
Stella981 Stella981
3年前
Python函数式编程
函数式编程\TOC\函数式编程。函数参数中的魔法coming...位置参数关键字参数默认参数动态参数位置参数收集关键字参数收集收集参数行为的逆向过程(解参,这个逆向过程用于实参上)参数传递嵌套函数定义
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Stella981 Stella981
3年前
Python time模块 返回格式化时间
常用命令  strftimetime.strftime("%Y%m%d%H:%M:%S",formattime)第二个参数为可选参数,不填第二个参数则返回格式化后的当前时间日期201812112:00:00time.strftime('%H:%M:%S')返回当前时间的时分秒time.strftim
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这