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

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

 -普通参数-
  • 普通参数又名为位置参数,没有默认值,根据具体使用位置进行传值
  • 普通参数和默认参数的不同
  • 普通参数就是如同名字一般普通,没有默认值
  • 而默认参数则可以规定默认值(也就是规定了默认值的普通参数而已)
  • 但是默认参数要牢记一点:默认参数必须指向不变的对象值
  • 请看下面例子


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  L

print(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来交流


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

原文地址:https://www.cnblogs.com/ggqjlzt/p/9692913.html

时间: 2024-10-07 21:37:07

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

Swift 定义函数 参数 返回值

定义多参数函数 - 用func声明函数  func 函数名 (参数名1: 参数类型, 参数名2: 参数类型) ->  返回类型{ 函数体 } func halfOpenRangeLength(start: Int, end: Int) -> Int { return end - start } let value = halfOpenRangeLength(1, end: 9) print(value)

frida so Hook 函数参数返回值修改

![](https://s1.51cto.com/images/blog/201905/21/e59d78e7f1f9e60f376fd81c75cbd12f.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) # -*- coding: UTF-8 -*- import frid

(一)Python入门-5函数:02形参和实参-文档字符串-函数注释-返回值详解

一:形参和实参 [操作]定义一个函数,实现两个数的比较,并返回较大的值. 1 def printMax(a,b): 2 '''实现两个数的比较,并返回最大值!''' 3 if a >b: 4 print(a,'较大值') 5 else: 6 print(b, '较大值') 7 8 printMax(20,30) 9 printMax(30,5) 10 11 #测试文档字符串的使用 12 help(printMax) 13 help(printMax.__doc__) 上面的 printMax 函

Python全栈__函数的初识、函数的返回值、函数的参数

1.函数的初识 def关键字 空格 函数名(与变量名命名规则相同):英文冒号 函数体 执行函数:函数名+() 函数是以功能为导向的. def login(): pass def register(): pass 1 def my_len(): 2 l1 = [1, 2, 3, 1, 6, 9, 10] 3 count = 0 4 for i in l1: 5 count += 1 6 my_len() 2.函数的返回值 return: 1.函数中遇到 return 结束函数,下面代码不执行. d

初识函数、函数的参数、函数的参数传值、函数的调用形式、函数的返回值

初识函数 内置函数自定义函数 定义无参函数 #只打印执行语句的时候def foo(): print('from the foo')# print(foo.__doc__) #查看函数的文档注释 定义有参函数 #依赖外部传来的值的时候def bar(x,y): print(x) print(y) 定义空函数 #程序开发阶段经常使用,写程序框架的时候def auth(): pass 函数的参数 函数的参数介绍形参和实参的概念 def foo(x,y): #在函数定义阶段,括号内定义的参数->形式参数

Python的函数式编程-传入函数、排序算法、函数作为返回值、匿名函数、偏函数、装饰器

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. 传入函数 函数的本身也可以作为参数. Python内建的mapreduce的函数.(来源于谷歌的,后来被道格这家伙开源了,成为当今处理大数据最火热的hadoop中的计算模型---MapReduce) 我们先看map.map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序

Python函数参数默认值的陷阱和原理深究(转)

add by zhj: 在Python文档中清楚的说明了默认参数是怎么工作的,如下 "Default parameter values are evaluated when the function definition is executed. This means that the expression is evaluated once, when the function is defined, and that the same “pre-computed” value is used

函数:语法 定义 参数 返回值

函数 我们可以先去定义?个事情或者功能. 等到需要的时候直接去用就好了. 那么这里定义的东?就是一个函数. 函数是对功能或者动作的封装函数: 对代码块和功能的封装和定义 函数的语法和定义 def 函数名(): 函数体 调用: 函数名() 函数的调?: 使用函数名可以调用函数, 写法: 函数名(), 这个时候函数的函数体会被执? 函数的返回执行完函数之后. 我们可以使用return来返回结果 return : 返回 1. 当程序没写过return, 不返回任何结果. 如果你非要接收. 接受到的是N

自定义函数中的参数返回值 “-&gt; (Int -&gt; Int)”的问题

func makeIncrementer() -> (Int -> Int) { func addOne(number: Int) -> Int { return 1 + number } return addOne } var increment = makeIncrementer() println(increment(7)) 这里为什么要写两个 Int->Int 这里是返回值是参数,左边是参数,右边是返回值的意思. 自定义函数中的参数返回值 "-> (Int