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. Codeforces 957 水位标记思维题

    A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...

  2. ubuntu 安装nvidia driver

    错误的命令:sudo apt-get install nvidiar-430好多教程都是这样 sudo apt-get install nvidia-driver-430  很奇怪这个命令变成这样 h ...

  3. 【串线篇】spring boot嵌入式Servlet容器自动配置原理

    EmbeddedServletContainerAutoConfiguration:嵌入式的Servlet容器自动配置? @AutoConfigureOrder(Ordered.HIGHEST_PREC ...

  4. 使用Vscode添加中文汉化插件

    一.首先打开Vscode,找到该软件的扩展,如下: 二.点击扩展按钮之后,会出现如下的界面,有一个扩展搜索输入框,输入chinese之后,会随之产生一些匹配的插件 三.重启一下Vscode,然后就看到 ...

  5. 【牛客Wannafly挑战赛23】F 计数

    题目链接 题意 给定一张边带权的无向图,求生成树的权值和是 k 的倍数的生成树个数模 p 的值. \(n\leq 100,k\leq 100,p\mod k=1\) Sol 看见整除然后 \(p\mo ...

  6. R语言 eval(quote(x)) 和 eval(x)

    eval() 's first argument is an expression. So if you only provide one argument, it will evaluate the ...

  7. Linux内核设计与实现 总结笔记(第十六章)页高速缓存和页回写

    页高速缓存是Linux内核实现磁盘缓存.磁盘告诉缓存重要源自:第一,访问磁盘的速度要远远低于访问内存. 第二,数据一旦被访问,就很有可能在短期内再次被访问到.这种短时期内集中访问同一片数据的原理称作临 ...

  8. paper about spring

    一.解析用户原始信息的json文件 #!/usr/bin/python # -*- coding=utf-8 -*- import os import sys import json def main ...

  9. Python List 列表list()方法

    Python基础数据类型之一列表list,在python中作用很强在,列表List可以包含不同类型的数据对像,同时它是一个有序的变量集合,每个变量可以存储一个地址.所有序列能用到的标准操作方法,列表也 ...

  10. MySQL Schedule Event

    建立事件历史日志表-- 用于查看事件执行时间等信息create table t_event_history  (     dbname  varchar(128) not null default ' ...