[Python3] 019 函数:确认过参数,返回对的值

目录


0. 函数简介

  1. 它是代码的一种组织形式
  2. 一个函数一般完成一项特定的功能,“人如其名”—— function
  3. 函数使用
    1. 函数需要先定义
    2. 使用函数,俗称调用(就像张无忌在万安寺下使用乾坤大挪移接住跳下来的六大门派的各位时要喊出招式名称一样,只不过他调用的是他的功法;有一点一样,名称不能错)

1. 初识函数

# 例1.1 定义一个函数

def func():
    # def 是定义函数的关键字,后要跟一个空格
    # func 为函数名,可自定义,起名最好遵循约定俗的成命名规则,如小驼峰
    # func 后面的括号和冒号都不能省,括号内可以有参数,也可以没有
    
    print("我是一个函数。")        # 此处是语句,按缩进判断代码是否属于函数
    print("我可以完成一定的功能。")
    
    return None                 # 若不写,默认也返回 None,写上后可以自定义返回的数据

print("我不属于函数。")            # 此句已经不属于函数了
  • 运行结果

我不属于函数。

只是定义的话不会执行。


# 例1.2 函数的调用;接着例1.1

func()  # 函数名后面要跟括号,函数名不能打错
  • 运行结果

我是一个函数。
我可以完成一定的功能。


2. 函数的参数与返回值

  • 参数: 负责给函数传递一些必要的数据或者信息
    • 形参(形式参数): 在函数定义的时候用到的参数,也许有个默认值,也许有个具体值,也许只是占个位,称为形参
    • 实参(实际参数): 在调用函数的时候输入的数据
  • 返回值: 函数的执行结果
    • 使用 return 关键字
    • 如果没有写 return 语句,默认返回一个 None
    • 函数一旦执行 return 语句,则无条件返回需返回的值,然后退出函数

少废话,上例子

# 例2 参数的定义和使用

def hello(person):  # person 就是一个形参
    print("{0}, 你好!".format(person))
  
p = "YorkFish"
hello(p)            # p 就是一个实参
  • 运行结果

YorkFish, 你好!


# 例3 return 语句的基本使用

def hello(person):
    print("{0}, 你好!".format(person))
    
    return "再见!"
  
p = "YorkFish"
rst = hello(p)

print("函数返回的是:",rst)
  • 运行结果

YorkFish, 你好!
函数返回的是: 再见!


3. 查找函数的帮助文档

  • 使用 help()
  • 之前几篇关于内置方法的随笔均有涉及,不再赘述

4. 函数的参数

(1) 参数分类

  • 普通参数
    • 定义时,直接定义变量名
    • 调用时,直接把变量或者值放入指定位置
  • 默认参数
    • 形参带有默认值
    • 调用时,若没有给相应的形参赋值,则使用默认值
  • 关键字参数
    • 看似麻烦,实则利大于弊
      • 可以不考虑参数位置
      • 不容易混淆
  • 收集参数
    • 相当于预留一些位置给以后可能会用的参数,可以看成是一个特定的数据结构
    • args 是约定俗成,虽然可以写成别的,但推荐写成 args
    • 参数名 args 前的星号不能省略
    • 收集参数可以和其他参数共存

(2) 结构介绍

1) 普通参数

# 定义
def func_name(参数1, 参数2, ...):
    func_body

# 调用
func_name(value1, value2, ...)
# 调用时,按位置传递参数,如 value1 传给参数1;value2 传给参数2

2) 默认参数

# 定义
def  func_name(参数1=值1, 参数2=值2, ...):
    func_body

# 调用1
func_name()

# 调用2
value1= 100
value2=200
func_name(value1, value2)

3) 关键字参数

# 定义
def func(参数1=值1, 参数2=值2, ...):
    func_body

# 调用1
func(parameter1=value1, parameter2=value2, ...)

# 调用2 像字典一样参数与其值成对,不用记参数的顺序了
func(parameter2=value2, parameter1=value1, ...)

4) 收集参数

# 定义
def func(*args):
    # 按照 list 使用方式访问 args 得到传入的参数
    
    func_body

# 调用
func(parameter1, parameter2, parameter3, ...)

(3) 走进收集参数

# 例4.1
# 函数模拟一个学生进行自我介绍,但内容未知

def stu(*args):
    print("Hello, everyone. Let me introduce myself to you.")
    print(type(args))
    for item in args:
        print(item)


stu("YorkFish", 18, "reading", "running", "music")
print('-'*30)
stu("Sheldon")
  • 运行结果

Hello, everyone. Let me introduce myself to you.
<class 'tuple'>
YorkFish
18
reading
running
music
------------------------------
Hello, everyone. Let me introduce myself to you.
<class 'tuple'>
Sheldon


# 例4.2

stu()
print('-'*30)

stu(name='YorkFish')
  • 运行结果

Hello, everyone. Let me introduce myself to you.
<class 'tuple'>
------------------------------
TypeError……stu() got an unexpected keyword argument 'name'

收集参数可以不带任何实参调用,此时收集参数为空 tuple。

但收集参数使用关键字参数格式调用,会抛出异常:stu() 得到不必要的关键字参数 name。


1) 关键字收集参数

  • 把关键字参数按字典格式存入收集参数
    • kwargs 为约定俗成
    • 调用时,把多余的关键字参数放入 kwargs
    • 访问 kwargs 需要按字典格式访问
  • 结构
# 定义
def func(**kwargs):
    func_body

# 调用
func(parameter1=value1, parameter2=value2, parameter3=value3, ...)
  • 示例
# 例5.1
# 函数模拟一个学生进行自我介绍,但内容未知

def stu(**kwargs):
    
    print("Hello, everyone. Let me introduce myself to you.")
    print(type(kwargs))     # 在函数体内使用 kwargs 不用带星号
    for k,v in kwargs.items():
        print(k, "<-->", v)
    
stu(name="YorkFish", age=18, hobby1="reading", hobby2="running", hobby3="music")
print("-"*30)

stu(name="leonard")
  • 运行结果

Hello, everyone. Let me introduce myself to you.
<class 'dict'>
name <--> YorkFish
age <--> 18
hobby1 <--> reading
hobby2 <--> running
hobby3 <--> music
------------------------------
Hello, everyone. Let me introduce myself to you.
<class 'dict'>
name <--> leonard


# 例5.2 接着例5.1

stu()   # 关键字收集参数也可以为空
  • 运行结果

Hello, everyone. Let me introduce myself to you.
<class 'dict'>


2) 收集参数混合调用的顺序问题

  • 收集参数,关键字参数,普通参数可以混合使用
  • 使用规则:普通参数和关键字参数优先
# 例6

# 函数模拟一个学生进行自我介绍
def stu(name, age, *args, hobby="None", **kwargs):
    print("Hello, everyone. Let me introduce myself to you.")
    print("My name is {0}, and I am {1} years old.".format(name, age))
    if hobby == "None":
        print("I don't have a hobby.")
    else:
        print("I like {0}".format(hobby))
    print("-"*30)
    
    for i in args:
        print(i)
    print("#"*30)
    
    for k,v in kwargs.items():
        print(k, "<-->", v) 
        
# 开始调用函数
name = "YorkFish"
age = 18

# 不同的调用方式
stu(name, age)
stu(name, age, hobby="reading")
stu(name, age, "Howard", "Raj", hobby="comic", hobby2="kites")
  • 运行结果

Hello, everyone. Let me introduce myself to you.
My name is YorkFish, and I am 18 years old.
I don't have a hobby.
------------------------------
##############################
Hello, everyone. Let me introduce myself to you.
My name is YorkFish, and I am 18 years old.
I like reading
------------------------------
##############################
Hello, everyone. Let me introduce myself to you.
My name is YorkFish, and I am 18 years old.
I like comic
------------------------------
Howard
Raj
##############################
hobby2 <--> kites

  • 补充:如果是自己一个人写东西,要么统一用空格缩进,要么统一用 Tab 缩进

3) 收集参数的解包问题

  • 把参数放入 list/dict 中,直接把 list/dict 中的值放入收集参数中
# 例7

def stu(*args):
    print("Hello!", end='\n\n')

    n = 0   # n 表示循环次数
    for i in args:
        print("n =", n)
        n += 1
        print("type(i) =",type(i))
        print("i =", i)
        print('-'*30)

list7 = ["YorkFish", 18, 666, "Python3"]

stu(*list7)     # 调用的时候前面加一个星号表示解包
  • 运行结果

Hello!

n = 0
type(i) = <class 'str'>
i = YorkFish
------------------------------
n = 1
type(i) = <class 'int'>
i = 18
------------------------------
n = 2
type(i) = <class 'int'>
i = 666
------------------------------
n = 3
type(i) = <class 'str'>
i = Python3
-----------------------------


4) dict 类型收集参数的解包

  • 对 dict 类型进行解包同收集参数的解包问题
  • 需要用两个星号进行解包

(4) 返回值

  • 函数都有返回值,因为 None 也是一种返回值
  • 需要用 return 显示返回内容
  • 如果没有写 return 语句,则默认返回 None
  • 推荐最后以 return 结束的写法
# 例8

def func8_1():
    print("有返回值!")
    return 1

def func8_2():
    print("没有返回值?")

f8_1 = func8_1()
print(f8_1)

f8_2 = func8_2()
print(f8_2)
  • 运行结果

有返回值!
1
没有返回值?
None


5. 函数文档

  • 作用:对当前函数提供使用相关的参考信息
  • 写法:
    • 在函数内部开始的第一行使用三引号字符串定义符
    • 参看下方例子
  • 文档查看
    • 使用 help() 函数,形如 help(func)
    • 使用 doc, 参看案例
# 例9.1

def stu(name, age, *args):
    '''
    第一行
    第二行
    第三行
    '''
    print("Over.")

help(stu)   # 查看函数文档
  • 运行结果

Help on function stu in module main:

stu(name, age, *args)
​ 第一行
​ 第二行
​ 第三行


# 例9.2 接着例9.1

stu.__doc__
  • 运行截图


# 例10

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

猜你喜欢

转载自www.cnblogs.com/yorkyu/p/10297761.html
今日推荐