安徽省建设造价管理协会网站,服务公司注册资金多少合适,天津手机版建站系统价格,深圳市信任网站文章目录1. 函数调用函数定义函数函数的参数递归函数2. 高阶函数map/reducefiltersorted3. 函数式编程返回函数匿名函数装饰器偏函数1. 函数
函数是一种重复代码的抽象方式#xff0c;Python 内建支持的一种封装#xff1b;
调用函数
调用一个函数#xff0c;需要知道函数…
文章目录1. 函数调用函数定义函数函数的参数递归函数2. 高阶函数map/reducefiltersorted3. 函数式编程返回函数匿名函数装饰器偏函数1. 函数
函数是一种重复代码的抽象方式Python 内建支持的一种封装
调用函数
调用一个函数需要知道函数的名称和参数函数名是只想一个函数对象的引用 a absa(-1)
1可以在交互式命令行通过 help(abs) 查看 abs 函数的帮助信息
数据类型转换 int(123)
123int(12.34)
12float(12.34)
12.34str(1.23)
1.23str(100)
100bool(1)
Truebool()
False开平方
# 方法一import mathmath.sqrt(100)
10.0# 方法二pow(100, 0.5)
10.0# 方法三100 ** 0.5
10.0定义函数
定义一个函数要使用 def 语句依次写出函数名、括号、括号中的参数和冒号:然后在缩进块中编写函数体函数的返回值用 return 语句返回。
如果没有 return 语句函数执行完毕后也会返回结果只是结果为 None。return None 可以简写为 return。
空函数
定义一个什么事也不做的空函数可以用 pass 来作为占位符
参数检查
调用函数时如果参数个数不对Python 解释器会自动检查出来并抛出 TypeError
返回多个值
Python 的函数返回多值其实就是返回一个 tuple在语法上返回一个 tuple 可以省略括号而多个变量可以同时接收一个 tuple按位置赋给对应的值
函数的参数
参数类型说明位置参数def power(x, n): 传入的值依次赋给对应位置的参数默认参数def power(x, n2): 在调用时可以不用输入该位置的参数而直接使用默认值变化大的参数放在前变化小的放在后作为默认参数降低调用难度调用含多个默认参数的函数时可以写上参数名如调用 def enroll(name, gender, age6, cityBeiging): 可以用enroll(Adam, M, cityTianjin)可变参数def calc(*numbers): 传入的参数个数时可变的在参数前面加 1 个 * 号参数接收到的将是一个 tuple在 tuple/list 前加 1 个 *可以将其以可变参数传入函数 calc(*[1,2,3])关键字参数def person(name, age, **kw): 同理可变参数在参数前面加 2 个_号允许传入 0 个或任意个含参数名的参数这些关键字参数在函数内部自动组装为一个dict在 dict前加 2 个_ 可以将其以关键字参数传入函数 person(name, age, **kw)命名关键字参数def person(name, age, *, city, job): 如果要限制关键字参数的名字可以用命名关键字参数命名参数需要以 * 分隔其后视为命名关键字参数如果函数定义了一个可变参数可以不要 *命名关键字参数可以给默认值
默认参数必须只想不可变对象 不可变对象减少了由于修改数据导致的错误多任务环境同时读取不需加锁
# 错误写法def add_end(L[]):
... L.append(End)
... return L
...add_end()
[End]add_end()
[End, End]参数组合
顺序必选参数 默认参数 可变参数 命名关键字参数 关键字参数
递归函数
一个函数在内部调用自己本身就叫递归函数
函数调用是通过栈实现的每进入一个函数调用加一层栈锁过多时会栈溢出
尾递归
把每一步的结果传递给递归函数和循环的效果一样栈不会增加python 解释器没有对尾递归做优化会栈溢出
汉诺塔
def move(n, a, b, c):if n 1:print(a, -, c)else:move(n-1, a, c, b)move(1, a, b, c)move(n-1, b, a, c)2. 高阶函数
Higher-order function
变量可以指向函数 and 函数名也是变量 - 函数可以接收另一个函数作为参数
其参数能够接收别的函数的函数就是高阶函数
map/reduce
map()
接收两个参数一个是函数(单个参数)一个是 Iterable 对象map 将传入的函数依次作用在 Iterable 对象的每一个元素上并把结果作为一个新的 Iterator 返回注意 Iterator 是惰性的 list(map(str, [1, 2, 3, 4, 5]))
[1, 2, 3, 4, 5]reduce()
把一个函数必须是两个参数作用在一个序列上reduce 把结果与下个元素做累计计算
reuce(f, [x1, x2, x3, x4]) f(f(f(x1, x2), x3), x4)# str2int
from functools import reduceDIGITS {0: 0,1: 1,2: 2,3: 3,4: 4,5: 5,6: 6,7: 7,8: 8,9: 9
}def char2num(c):return DIGITS[c]def str2int(s):return reduce(lambda x1, x2: x1 * 10 x2, map(char2num, s))# str2float
from functools import reduceDIGITS {0: 0,1: 1,2: 2,3: 3,4: 4,5: 5,6: 6,7: 7,8: 8,9: 9
}def char2num(c):return DIGITS[c]def str2int(s):return reduce(lambda x1, x2: x1 * 10 x2,map(char2num, [c for c in s if c ! .]))def str2float(s):return str2int(s) / (10**s[::-1].index(.))# str2float
def str2float(s):point 0def to_float(i, c):nonlocal pointif not isinstance(c, int):point 1return iif point 0:return i * 10 celse:point * 10return i c / pointreturn reduce(to_float, map(char2num, s))nonlocal 关键字用来在函数或其他作用域使用外层非全局变量
filter
接收一个函数单个参数和一个序列序列的每个元素作用于函数返回 True/False 决定是否保留该元素
素数 - 埃氏筛选
def _odd_iter():n 1while True:n 2yield ndef _not_divisible(n):return lambda x: x % n 0def primes():yield 2oi _odd_iter()while True:n next(oi)yield noi filter(_not_divisible(n), oi)sorted
接收一个 Iterable 对象一个函数形参key一个参数的函数以及 reversekey 作用与序列的每个元素再对结果排序reverse 表示是否反向排序默认为 False
3. 函数式编程
面向过程程序设计
通过一层一层的函数调用把复杂的任务分解成简单任务这种分解称之为面向过程的程序设计函数是面向过程编程的基本单元
Functional Programming
一种抽象程度很高的编程范式纯粹的函数式编程语言Lisp编写的函数没有变量只要输入确定输出就是确定的没有副作用。允许使用变量的函数内部变量状态不确定同样输入可能输出不同
Python 对函数式编程提供部分支持其允许使用变量不是纯函数式编程语言
返回函数
函数作为返回值 往往不需要立即执行的时候可以使用返回函数的方式达到惰性计算的效果lazy
闭包Closure 当返回函数时相关参数和变量都保存在返回的函数中这种程序结构成为闭包
def count():fs []for i in range(1, 4):def f():return i*ifs.append(f)return fsf1, f2, f3 count()f1()
9f2()
9f3()
9返回的函数引用了变量 i但它并没有立刻执行等到 3 个函数都返回时它们引用的变量 i 已经变成了 3因此最终结果都是 9
返回闭包时返回函数不要引用任何循环变量或者后续会发生变化的变量
def count():def f(j):def g():return j*jreturn gfs []for i in range(1, 4):# f(i) 立即执行因此 i 的当前值被传入 f()fs.append(f(i))return fsf1, f2, f3 count()f1()
1f2()
4f3()
9添加多层函数用执行外层函数将循环变量的值绑定到函数的参数中可以绑定循环变量变化过程中的值
计数器闭包
def createCounter():def counter():n 0while True:n 1yield nc counter()return lambda : next(c)def createCounter():n 0def counter():nonlocal nn 1return nreturn counter匿名函数
关键字 lambda 表示匿名函数冒号前面的是参数表冒号后面的是返回结果不用写 return只能有一个表达式
匿名函数也是一个函数对象也可以把匿名函数赋值给一个变量再利用变量来调用该函数 f lambda x: x*xf(5)
25也可以把匿名函数当作一个函数的返回值返回
def build(x, y):return lambda x, y: x*x y*y装饰器
Decorator
在函数调用前后自动增加处理不修改函数的定义这种在代码运行期间动态增加功能的方式即为 Decorator
import functoolsdef log(func):functools.wraps(func)def wrapper(*args, **kwargs):print(fcall {func.__name__}():)return func(*args, **kwargs)return wrapperdef log(info):def decorator(func):functools.wraps(func)def wrapper(*args, **kwargs):print(f{info} {func.__name__})return func(*args, **kwargs)return wrapperreturn decorator调用 Decorator
log
def now():print(2020-11-12)now log(now)log(execute)
def now():print(2020-11-12)now log(execute)(now)functools.wraps(func) 的作用是将 wrapper 函数的 __name__ 改为被装饰函数对象的 __name__ 相当于
wrapper.__name__ func.__name__Decorator 即在 面向对象(OOP) 的 设计模式 中的 装饰模式OOP 的装饰模式通过类的继承和组合实现而 Python 可以直接从语法层面支持 decorator也可以通过类实现
偏函数
Partial function
把一个函数的某些参数固定住给这些参数设置默认值返回一个新函数以方便调用
偏函数仅仅是给参数设定了默认值在调用新函数时是可以传入其他值给这些参数的
import functools
# 相当于
# kw {base: 2}
# int(1000000, **kw)int2 functools.partial(int, base2)int2(1000000)
64int2(1000000, base10)
1000000# 相当于
# args [10]
# args.extend([5, 6, 7])
# max(*args)max2 functools.partial(max, 10)max2(5, 6, 7)
10创建偏函数时实际接收的参数是函数对象*args / **kwargs 上一篇「Python 基础」基础语法与高级特性 专栏《Python 基础》
PS感谢每一位志同道合者的阅读欢迎关注、评论、赞 文章转载自: http://www.morning.gywfp.cn.gov.cn.gywfp.cn http://www.morning.xlmgq.cn.gov.cn.xlmgq.cn http://www.morning.qxnlc.cn.gov.cn.qxnlc.cn http://www.morning.tyjnr.cn.gov.cn.tyjnr.cn http://www.morning.lmfxq.cn.gov.cn.lmfxq.cn http://www.morning.smsjx.cn.gov.cn.smsjx.cn http://www.morning.hcwjls.com.gov.cn.hcwjls.com http://www.morning.ktfbl.cn.gov.cn.ktfbl.cn http://www.morning.rmqmc.cn.gov.cn.rmqmc.cn http://www.morning.lnbcx.cn.gov.cn.lnbcx.cn http://www.morning.cwrpd.cn.gov.cn.cwrpd.cn http://www.morning.hbxnb.cn.gov.cn.hbxnb.cn http://www.morning.rrwft.cn.gov.cn.rrwft.cn http://www.morning.znnsk.cn.gov.cn.znnsk.cn http://www.morning.pwwdp.cn.gov.cn.pwwdp.cn http://www.morning.xjqkh.cn.gov.cn.xjqkh.cn http://www.morning.wdpbq.cn.gov.cn.wdpbq.cn http://www.morning.ghryk.cn.gov.cn.ghryk.cn http://www.morning.kfwrq.cn.gov.cn.kfwrq.cn http://www.morning.dwmtk.cn.gov.cn.dwmtk.cn http://www.morning.yrpg.cn.gov.cn.yrpg.cn http://www.morning.tbcfj.cn.gov.cn.tbcfj.cn http://www.morning.tpnch.cn.gov.cn.tpnch.cn http://www.morning.dnjwm.cn.gov.cn.dnjwm.cn http://www.morning.mkyny.cn.gov.cn.mkyny.cn http://www.morning.tbhlc.cn.gov.cn.tbhlc.cn http://www.morning.sgbss.cn.gov.cn.sgbss.cn http://www.morning.lgznf.cn.gov.cn.lgznf.cn http://www.morning.trnl.cn.gov.cn.trnl.cn http://www.morning.tsflw.cn.gov.cn.tsflw.cn http://www.morning.kfhm.cn.gov.cn.kfhm.cn http://www.morning.tfrlj.cn.gov.cn.tfrlj.cn http://www.morning.wqkzf.cn.gov.cn.wqkzf.cn http://www.morning.krkwp.cn.gov.cn.krkwp.cn http://www.morning.kxryg.cn.gov.cn.kxryg.cn http://www.morning.zdtfr.cn.gov.cn.zdtfr.cn http://www.morning.fhqdb.cn.gov.cn.fhqdb.cn http://www.morning.smggx.cn.gov.cn.smggx.cn http://www.morning.znmwb.cn.gov.cn.znmwb.cn http://www.morning.rxfbf.cn.gov.cn.rxfbf.cn http://www.morning.mwnch.cn.gov.cn.mwnch.cn http://www.morning.pgxjl.cn.gov.cn.pgxjl.cn http://www.morning.qbtj.cn.gov.cn.qbtj.cn http://www.morning.dgxrz.cn.gov.cn.dgxrz.cn http://www.morning.ngqdp.cn.gov.cn.ngqdp.cn http://www.morning.rqgjr.cn.gov.cn.rqgjr.cn http://www.morning.krjrb.cn.gov.cn.krjrb.cn http://www.morning.c7630.cn.gov.cn.c7630.cn http://www.morning.rxfbf.cn.gov.cn.rxfbf.cn http://www.morning.tftw.cn.gov.cn.tftw.cn http://www.morning.thpns.cn.gov.cn.thpns.cn http://www.morning.pljxz.cn.gov.cn.pljxz.cn http://www.morning.ddqdl.cn.gov.cn.ddqdl.cn http://www.morning.lmqw.cn.gov.cn.lmqw.cn http://www.morning.qfmcm.cn.gov.cn.qfmcm.cn http://www.morning.c7495.cn.gov.cn.c7495.cn http://www.morning.tlnbg.cn.gov.cn.tlnbg.cn http://www.morning.jgnst.cn.gov.cn.jgnst.cn http://www.morning.pzbjy.cn.gov.cn.pzbjy.cn http://www.morning.trrrm.cn.gov.cn.trrrm.cn http://www.morning.ggfdq.cn.gov.cn.ggfdq.cn http://www.morning.yrsg.cn.gov.cn.yrsg.cn http://www.morning.npfrj.cn.gov.cn.npfrj.cn http://www.morning.fpkpz.cn.gov.cn.fpkpz.cn http://www.morning.ftzll.cn.gov.cn.ftzll.cn http://www.morning.wptrm.cn.gov.cn.wptrm.cn http://www.morning.kqxwm.cn.gov.cn.kqxwm.cn http://www.morning.nxcgp.cn.gov.cn.nxcgp.cn http://www.morning.nwmwp.cn.gov.cn.nwmwp.cn http://www.morning.jjnry.cn.gov.cn.jjnry.cn http://www.morning.lfxcj.cn.gov.cn.lfxcj.cn http://www.morning.khclr.cn.gov.cn.khclr.cn http://www.morning.zpxwg.cn.gov.cn.zpxwg.cn http://www.morning.kskpx.cn.gov.cn.kskpx.cn http://www.morning.lbcbq.cn.gov.cn.lbcbq.cn http://www.morning.xshkh.cn.gov.cn.xshkh.cn http://www.morning.jcffp.cn.gov.cn.jcffp.cn http://www.morning.kyzxh.cn.gov.cn.kyzxh.cn http://www.morning.msgnx.cn.gov.cn.msgnx.cn http://www.morning.snrbl.cn.gov.cn.snrbl.cn