函数

Posted zane021

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数相关的知识,希望对你有一定的参考价值。

一、函数体系知识

1 什么是函数?
2 为什么要用函数?
3 函数的分类:内置函数与自定义函数
4 如何自定义函数
语法
定义有参数函数,及有参函数的应用场景
定义无参数函数,及无参函数的应用场景
定义空函数,及空函数的应用场景

5 调用函数
如何调用函数
函数的返回值
函数参数的应用:形参和实参,位置参数,关键字参数,默认参数,*args,**kwargs

6 高阶函数(函数对象)
7 函数嵌套
8 作用域与名称空间
9 装饰器
10 迭代器与生成器及协程函数
11 三元运算,列表解析、生成器表达式
12 函数的递归调用
13 内置函数
14 面向过程编程与函数式编程

二、函数基础

1. 为什么要有函数?什么是函数?
1)组织结构不清晰,可读性差;
2)代码冗余;
3)管理维护难度极大,扩展性差;

具备某一功能的工具就是程序中的函数;
事先准备工具的过程,即函数的定义;
拿来就用,即函数的调用;

所以函数的使用必须遵循,先定义,再调用。
2. 函数定义:
语法:
def 函数名(参数1,参数2, 参数3,...):
‘‘‘
文档描述
‘‘‘
return
def: 关键字
函数名:用来调用函数(函数名的命名,必须能够反映出函数的功能)
文档描述:推荐写,来增强函数的可读性
return: 函数的返回值

函数名(): 小括号调用函数

函数调用的过程:
a. 先找到内存中函数名对应的值(函数体);
b. 通过小括号来引用这个函数体,同时会传入函数需要的参数;
c. 执行函数体的代码;
1)定义函数的三种类型
a. 有参函数:
参数是函数体代码用来接收外部传入值的;
b. 无参函数:
当函数体的代码逻辑,不需要函数的调用者传入值的情况下,就无参;
定义时无参,意味着调用是也不需要传入参数;
c. 空函数:
函数体为 pass
def func():
pass
3. 函数调用
函数名加括号,即调用函数;
原则:先定义,后调用;没有定义函数直接调用,就相当于调用一个不存在变量名;
定义阶段:只检测语法,不执行函数代码;
调用阶段:执行函数代码;

4. 函数返回 return
1) 返回的三种情况:
a. 无return语句,或只写一个 return关键字:
返回 None
b. return 一个值:
返回该值
c. return 多个值:
返回一个元组
2) 函数体内可以有多个return语句,return语句执行之后,函数结束;

5. 形参与实参是什么?

定义:形参即变量名,实参即变量值。
重点:函数调用时,将值绑定到变量名上,函数调用结束,解除绑定。
例子:
def foo(x, y): # x, y 是形参
pass
foo(10, 11) # 10,11 是实参
1)位置参数: 实参
a. 按照从左到右的顺序定义的参数
b. 位置形参:必选参数;
c. 位置实参:按照位置给形参传值;
2)关键字参数:实参
a. 按照key=value的形式定义的实参;
b. 无需按照位置为形参传值;
c. 注意:
关键字实参必须在位置实参右面;
对同一个形参不能重复传值;
3)默认参数:形参
a. 形参在定义时就已经为其赋值
b. 可以传值也可以不传值;
c. 经常需要变得参数定义成位置形参;
d. 变化较小的参数定义成默认参数(形参);
e. 注意:
默认参数只在定义时赋值一次;
默认参数的定义应该在位置形参右面;
默认参数通常应该定义成不可变类型;
4)可变长参数:形参
a. 可变长指的是实参值的个数不固定;
b. 而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs;
5)命名关键字参数: 形参
a. *后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递
b. 可以保证,传入的参数中一定包含某些关键字;

三、函数对象、函数嵌套、名称空间与作用域、装饰器

(一)函数对象
1. 函数是一类对象,即函数可以当作数据传递
1)可以被引用;
2)可以当作参数传递;
3)返回值可以是函数;
3)可以当作容器类型的元素;
2. 利用函数对象可传递的特性,优雅取代多分支的if
例子:
def foo():
print(‘foo‘)

def bar():
print(‘bar‘)

dic={
‘foo‘:foo,
‘bar‘:bar,
}
while True:
choice=input(‘>>: ‘).strip()
if choice in dic:
dic[choice]()
(二)函数嵌套
1. 函数的嵌套调用
def max(x,y):
return x if x > y else y

def max4(a,b,c,d):
res1=max(a,b)
res2=max(res1,c)
res3=max(res2,d)
return res3
print(max4(1,2,3,4))
2. 函数的嵌套定义
def f1():
def f2():
def f3():
print(‘from f3‘)
f3()
f2()

f1()
f3() # 调用内部函数报错,不在全局的命名空间

(三)名称空间与作用域
1. 什么是名称空间?
名称空间:
存放名字的地方,三种名称空间。
例子:
x = 1,1存放于内存中,那名字x存放在哪里呢? --> 名称空间:存放名字 x,和存放 x与1 绑定关系。
2. 名称空间的加载顺序
内置名称空间 --> 全局名称空间 --> 局部名称空间
python test.py
1)python解释器先启动,加载内置名称空间(python解释器自带的);
2)执行test.py文件,然后以文件为基础,加载全局名称空间;
3)在执行文件的过程中如果调用函数,则临时产生局部名称空间;
内置名称空间:随着python解释的启动而生效,解释器运行结束失效;
全局名称空间:文件级别的名字,在运行文件时生效,运行结束结束或运行时被删除失效;
局部名称空间:只存在函数内部,只有在函数被调用时临时生效,调用结束失效;
3. 名字的查找顺序
局部名称空间 ---> 全局名称空间 ---> 内置名称空间
注意:在全局无法查看局部的,在局部可以查看全局的
4.作用域
1)作用域即范围
全局作用域(内置名称空间与全局名称空间):全局存活,全局有效;
a. 在任意位置都能访问到;
b. 该范围的名字会伴随程序整个生命周期;
局部作用域(局部名称空间):临时存活,局部有效;
a. 只能在函数内使用;
b. 调用函数时生效,调用结束失效;
2)作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关;

5. 关键字 global 与 nonlocal
1)关键字 global
a. 声明全局变量,如果在局部要对全局变量修改,需要在局部也要先声明该全局变量。
b. 在局部如果不声明全局变量,并且不修改全局变量。则可以正常使用全局变量。
2)关键字 nonloccal 用来在函数或其他作用域中使用外层(非全局)变量
用来在函数或其他作用域中使用外层(非全局)变量。

(四)闭包函数
1. 什么是闭包?
内部函数包含对外部作用域而非全局作用域的引用。
2. 闭包的意义与应用
1)意义:
返回一个包含上层作用域状态的函数对象,该函数对象无论在何处调用,优先使用自己外层包裹的作用域。
2) 应用领域:
延迟计算(原来我们是传参,现在我们是包起来)
例子:
from urllib.request import urlopen

def index(url):
def get():
return urlopen(url).read()
return get

baidu=index(‘http://www.baidu.com‘)
print(baidu().decode(‘utf-8‘))

以上是关于函数的主要内容,如果未能解决你的问题,请参考以下文章

测开之函数进阶篇・第五篇《递归函数纯函数匿名函数偏函数》

8InfluxDB常用函数聚合函数,count()函数,DISTINCT()函数,MEAN()函数,MEDIAN()函数,SPREAD()函数,SUM()函数

Kotlin函数式编程 ② ( 过滤函数 | predicate 谓词函数 | filter 过滤函数 | 合并函数 | zip 函数 | folder 函数 | 函数式编程意义 )

Kotlin函数式编程 ② ( 过滤函数 | predicate 谓词函数 | filter 过滤函数 | 合并函数 | zip 函数 | folder 函数 | 函数式编程意义 )

1.19.9.函数概览函数引用精确函数引用模糊函数引用函数解析顺序精确函数引用模糊函数引用自定义函数准备工作概述开发指南函数类求值方法标量函数表值函数聚合函数

Kotlin函数式编程 ① ( 函数式编程简介 | 高阶函数 | 函数类别 | Transform 变换函数 | 过滤函数 | 合并函数 | map 变换函数 | flatMap 变换函数 )