python入门3 函数
1.Python中的函数
- 函数的意义:
1.对输入进行变换映射后输出
2.过程化 VS 结构化 - 函数的创建及结构:
定义函数名
参数
函数体
返回 :
有无返回
return与yield的区别(用yield后函数就变成一个生成器 每次用yield会记录函数运行到哪一步了 用next(函数)可以继续运行)
函数实际上是对功能的一种封装
def foo (num)for i in range(num):cumsum+=ireturn cumsum 这里有返回值
2.函数中的参数
- 参数:
语法:func(positional_args,keyword_args,*tuple_nonkw_args,**dict_kw_args) - 按参数传递方式:
位置参数(定位参数,非关键字参数) :位置顺序十分重要
关键字参数:
def foo3(intro(关键字)='123')print(intro)
位置参数包裹及使用*
参数数量不确定
def mysun(*args)return sun(args)
关键字参数包裹及使用**
def filmInfo(**kwargs):print(type(kwargs))for key,values in kwargs.items():print(key,':',values)filmInfo(film='羞羞的铁拳',box=3.5)filmInfo(film='羞羞的铁拳',box=3.5,rate=7.9)
包裹解包顺序 :首先拆位置参数包裹,按顺序给必选,默认,可变。再拆关键字参数包裹
传递参数时使用包裹
l1=[1,5,6,7,2,5,3,5,9,6,3,4]
def mysum(*args)return sum(args)mysum(*l1) 数组带星号输出结果:(1,5,6,7,2,5,3,5,9,6,3,4)这里不再是求和是一个一个输出,因为是包裹相当于mysum(1.5.7.....) 一个一个参数输入
- 按参数的类型:
必选(位置参数)
关键字/默认
*args可变长位置参数,**kwargs可变长关键字参数 - 函数如何处理传入参数:
值传递参数(函数前后参数不变,参数为不可变类型)与指针传递参数(函数前后参数有改变,指针参数一般为数组)
3.变量作用域 - 标识符的作用域
- 全局变量
定义 :所有函数外部的一个变量
经过函数时
然后,除非被del(主动删除) - 局部变量
函数内部创建与访问
函数被调用结束时结束, - 变量的搜索顺序
覆盖问题
局部作用域->全局作用域
□locals()#局部名称空间 (可以在运行框中看有什么方法)
□globals()#全局名称空间 (可以在运行框中看有什么方法)
4.偏函数PFA - 偏函数Partial function application
使用场景:如果一个函数的参数很多,而在每次调用的时候有一些又经常不需要被指定时(几个参数固定),就可 以使用偏函数(近似理解为默认值)
语法:partical(func,*args,**keywords)
使用:from functools import partial
原理:创建一个新函数,固定住原函数的部分参 数(可以为位置参数,也可以是关键字参数)
将一个16进制的数转换成10进制
import functools
hex2int=functools.partial(int,base=16) 偏函数hex2int('F')
结果:15
5.递归函数
- 定义: 函数在内部调用自身
- 例子: 求一个列表中数值的累加
递归的方法求一个列表中的值得累加
def fool(num):if len(num)==1return num[0]else:return num[0]+fool(num[1: ])fool([1,2,31,5,6,55])
结果:100
6.高阶函数
- 函数的引用与调用
引用:访问,变量别名(多个别名引用)
调用:函数() (这样就用了这个函数) - 函数对象既然可以被引用,那可以作为参数被传入或作 为结果被返回吗?
可以 - 高阶函数: 一个函数接收另一个函数作为参数
def myfoo(num,func):return func(num) func是一个函数myfoo([1,3,5,76,99],max)
结果:99
- 回调函数: 函数作为调用函数的结果返回
7.BIFs中的高阶函数(内置的) - filter 核心点:在list中对每个元素做过滤
- map 核心点:对每个元素做映射
- reduce
核心点:list内元素两两操作传给func ,然后继续两两运算直到list走完
Python 3.x中,reduce()函数已经被从全局名字 空间里移除了,它和partical一样被放置在 fucntools模块中。使用前需要调用.
8.匿名函数lambda(简化函数) - 匿名函数lambda:
使用场景:
返回简单结束 ,不需要专门定义函数
特点: 简洁,同一行定义体+声明。不用写return
定义: 定义后,赋值给一个变量,做正常函数使用foo=lambda x,y:x+y
lambda关键字定义在高阶函数的参数位上
语法: lambda(args1,args2, argsN):expression
9.闭包Closure - 闭包的概念 涉及嵌套函数时才有闭包问题 内层函数引用了外层函数的变量(参数),然后 返回内层函数的情况,称为闭包(Closure)。 这些外层空间中被引用的变量叫做这个函数的环 境变量。 环境变量和这个非全局函数一起构成了闭包。
def fool(nums_in_function):print('nums_in_function此时在fool中,可以被访问:',nums_in_function)def foot2():return max(nums_in_function) 虽然没有给foot2任何参数,但foot2却能访问到fool中的参数return foot2fool([5.3.8])
结果:8
- 闭包的特点: 函数会记住外层函数的变量
- 闭包的实现:
10.装饰器Decorator - 定义: 以函数作参数并返回一个替换函数的可执行函数
- 简单理解: 装饰器的作用就是为已存在的对象添加额外功能 为一个函数增加一个装饰(用另一个函数装饰) 本质上就一个返回函数的高阶函数
- 应用: 给函数动态增加功能(函数)
- 定义与使用:
import datetime
def extrafoo(func):def inner():print('extra:',datetime.now())print('from inner to execute:'func._name_)print('the',func._name_,'result:',func())return inner@extrafoo @是python装饰器的简便写法,也叫语法糖
def fool():return 'this is fool function'执行:fool() 装饰器里的内容在函数中也会打印
11.函数式编程Functional Programming
- 函数式编程思想: 函数是第一等公民First Class 函数式编程是一种编程范式,是如何编写程度的方法论。 把运算过程尽量变成一系列函数的调用。属于结构化编程
- 特点: 允许函数作为参数,传入另一个函数 返回一个函数
- 理解: 结合本章知识点,案例进行理解