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

[Python3] 019 函数:确认过参数,返回对的值的更多相关文章

  1. C++ 函数重载和参数的缺省值

    一.函数重载 1.1 重载的起源 自然语言中,一个词可以有许多不同的含义,即该词被重载了.人们可以通过上下文来判断该词到底是哪种含义."词的重载"可以使语言更加简练.例如" ...

  2. ZeroMQ接口函数之 :zmq_errno – 返回errno的值给调用此函数的线程

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_errno zmq_errno(3)         ØMQ Manual - ØMQ/3.2.5 Name zm ...

  3. 自定义函数中的参数返回值 “-> (Int -> Int)”的问题

    func makeIncrementer() -> (Int -> Int) { func addOne(number: Int) -> Int { + number } retur ...

  4. 编写函数,接受一个string,返回一个bool值,指出string是否有5个或者更多字符,使用此函数打印出长度大于等于5的元素

    #include <algorithm> using namespace std; bool isFive(const string& s1) { return s1.size() ...

  5. 【C/C++】函数的默认参数/函数的占位参数/函数重载/注意事项

    函数的默认参数 返回值类型 函数名(参数=默认值){} #include <iostream> using namespace std; int func(int a = 10, int ...

  6. Swift函数_默认参数

    swift中提供了默认参数功能,在声明函数时给参数指定默认值. 例: func inputStudentInfo(name:String,age:Int="26") { print ...

  7. Python学习教程(learning Python)--2.3.5 Python返回多个值问题

    本节主要学习Python的函数是如何同时返回多个值的问题. 在学习Python的时候惊奇的发现,Python的函数可以同时返回多个值,很有意思. #define function sum def su ...

  8. 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针

      您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...

  9. isNaN() 函数用于检查其参数是否是非数字值。如果是非数字值则返回true

    isNaN() 函数用于检查其参数是否是非数字值.如果是非数字值则返回true.document.write(isNaN(0)); falsedocument.write(isNaN("He ...

随机推荐

  1. 文本数据挖掘 Matrix67: The Aha Moments

    转自:http://www.matrix67.com/blog/archives/5044 互联网时代的社会语言学:基于SNS的文本数据挖掘 今年上半年,我在人人网实习了一段时间,期间得到了很多宝贵的 ...

  2. 欧拉降幂公式 Super A^B mod C

    Description Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=100000 ...

  3. logback系列二:logback在项目中的应用

    1.输出http日志 2.输出dubbo日志 3.输出interfacer日志 4.输出到access,remote,app等目录中

  4. bullet学习日记

    最近需要bullet用物理引擎做一个测量类的项目,因为半途接手,物理部分其实已经实现,但犹于对bullet基本不了解,导致相关部分完全改不动,这两天静下心来把物理引擎用法了解了一翻,顺便做点笔记,以便 ...

  5. PHP超大文件上传与下载

    前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...

  6. windows10 ubuntu子系统 WSL文件位置

    windows10 的linux子系统(windows subsystem for linux)WSL 文件位置 以我的系统为例,WSL的root目录对应windows的: C:\Users\xiao ...

  7. linux 多进程并发服务__关于子进程回收的方法

    以TCPServ 服务程序来说: 1)父进程:负责系统初始化,以及监听(listen),接受连接请求(accept);其中accept 默认阻塞调用. 2)每接受一个连接请求,动态新建(fork)一个 ...

  8. RabbitMQ消费端ACK与重回队列机制,TTL,死信队列详解(十一)

    消费端的手工ACK和NACK 消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿. 如果由于服务器宕机等严重问题,那么我们就需要手工进行ACK保障消费端成功. 消费端重回队列 ...

  9. hashcode native

    hashcode Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值. 在设计hashCode方法和equal ...

  10. CSS基础-background的那些属性

    background的那些属性 background:背景的意思常用的六个属性 1.background-color:背景颜色 2.background-image:背景图像 3.background ...