# “小”函数举例
def printA():
print("AAAAAA")
printA()
AAAAAA
# lambda表达式的用法
# 1. 以lambda开头
# 2. 紧跟一定的参数(如果有的话)
# 3. 参数后用冒号和表达式主体隔开
# 4. 只是一个表达式,所以,没有return
# 计算一个数字的100倍数
# 因为就是一个表达式,所以没有return
stm = lambda x: 100 * x
# 使用上跟函数调用一模一样
stm(89)
8900
stm2 = lambda x,y,z: x + y*10 + z*100
stm2(4, 5, 6)
654
# 变量可以赋值
a = 100
b = a
# 函数名称就是一个变量
def funA():
print("In funA")
funB = funA
funB()
In funA
# 高阶函数举例
# funA是普通函数,返回一个传入数字的100倍
def funA(n):
return n * 100
# 再写一个函数,把传入参乘以300倍,利用高阶函数
def funB(n):
# 最终是想返回300n
return funA(n) * 3
print(funB(9))
# 写一个高阶函数
def funC(n, f):
# 假定函数是把n扩大100呗
return f(n) * 3
print(funC(9, funA))
# 比较funC和funB,显然funC的写法要优于funB
# 例如:
def funD(n):
return n*10
# 需求变更,需要把n放大30倍,此时funB无法实现
print(funC(7, funD))
2700
2700
210
# map举例
# 有一个列表,想对列表里的每一个元素乘以10,并得到新的列表
l1 = [i for i in range(10)]
print(l1)
l2 = []
for i in l1:
l2.append(i * 10)
print(l2)
# 利用map实现
def numTen(n):
return n*10
# help(map)
l3 = map(numTen, l1)
# map类型是一个可迭代的结构,所以可以使用for遍历
print(type(l3))
print([i for i in l3])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
<class 'map'>
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
from functools import reduce
# 定义一个操作函数
# 加入操作函数只是相加
def myAdd(x,y):
return x + y
# 对于列表[1,2,3,4,5,6]执行myAdd的reduce操作
rst = reduce(myAdd, [1,2,3,4,5,6])
print(rst)
21
# filter案例
# 对于一个列表,对其进行过滤,偶数生成一个新列表
# 需要定义过滤函数
# 过滤函数要求有输入,返回布尔值
def isEven(a):
return a % 2 == 0
l = [1,2,3,4,5,56,44,3,243]
rst = filter(isEven, l)
# 返回的filter内容是一个可迭代对象
print(type(rst))
print(rst)
print([i for i in rst])
<class 'filter'>
<filter object at 0x000002D30626EB00>
[2, 4, 56, 44]
# 排序的案例
a = [232,432,543,432,432,43,65,67]
al = sorted(a, reverse=True)
print(al)
[543, 432, 432, 432, 232, 67, 65, 43]
# 排序案例2
a = [-32,43,432,-43,43]
# 按照绝对值进行排序
# abs是求绝对值的意思
# 即按照绝对值的倒叙排列
al = sorted(a, key=abs, reverse=True)
print(al)
[432, 43, -43, 43, -32]
# sorted案例
astr = ['Duo', 'chen', 'fdsf']
str1 = sorted(astr)
print(str1)
str2 = sorted(astr, key=str.lower)
print(str2)
['Duo', 'chen', 'fdsf']
['chen', 'Duo', 'fdsf']
# 定义一个普通函数
def myF(a):
print('In myF')
return None
a = myF(8)
print(a)
In myF
None
# 函数作为返回值返回,被返回的函数在函数体内定义
def myF2():
def myF3():
print("In myF3")
return 3
return myF3
# 使用上面定义
# 调用myF2, 返回一个函数myF3,赋值给f3
f3 = myF2()
print(type(f3))
print(f3)
f3()
<class 'function'>
<function myF2.<locals>.myF3 at 0x000002D306D06620>
In myF3
3
# 复杂一点的返回函数的例子
# args:参数列表
# 1. myF4定义函数,返回内部定义的函数myF5
# 2. myF5使用了外部变量,这个变量是myF4的参数
def myF4( *args):
def myF5():
rst = 0
for n in args:
rst += n
return rst
return myF5
f5 = myF4(1,2,3,4,5,6,7,8,9,0)
# f5的调用方式
f5()
45
f6 = myF4(10,20,30,40,50)
# f5的调用方式
f6()
150
# 闭包常见坑
def count():
# 定义列表,列表里存放的是定义的函数
fs = []
for i in range(1, 4):
# 定义了一个函数
# f是一个闭包结构
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
print(f1())
print(f2())
print(f3())
9
9
9
# 修改上述函数
def count1():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i))
return fs
f1, f2, f3 = count1()
print(f1())
print(f2())
print(f3())
1
4
9
def hello():
print("Hello world")
hello()
Hello world
f = hello
f()
Hello world
# f和hello是一个函数
print(id(f))
print(id(hello))
print(f.__name__)
print(hello.__name__)
2501087682072
2501087682072
hello
hello
# 现在有新的需求
# 对hello功能进行扩展,每次打印hello之前打印当前系统时间
# 而实现这个功能又不能改动现有代码
# ==>使用装饰器
# 任务:
# 对hello函数进行功能扩展,每次执行hello打印当前时间
import time
# 高阶函数,以函数作为参数
def printTime(f):
def wrapper(*args, **kwargs):
print("Time:", time.ctime())
return f(*args, **kwargs)
return wrapper
# 上面定义了装饰器,使用的时候需要用到@,此符号是python的语法糖
@printTime
def hello():
print("Hello world")
hello()
Time: Sun Jun 2 08:27:35 2019
Hello world
# 装饰器的好处是,一旦定义,则可以装饰任意函数
# 一旦被其装饰,则把装饰器的功能直接添加到定义函数的功能上
@printTime
def hello2():
print("11")
print("22")
hello2()
Time: Sun Jun 2 08:30:07 2019
11
22
# 上面对函数的装饰使用系统定义的语法糖
# 下面开始手动执行下装饰器
# 先定义函数
def hello3():
print("手动执行")
hello3()
hello3 = printTime(hello3)
hello3()
f = printTime(hello3)
f()
手动执行
Time: Sun Jun 2 08:33:35 2019
手动执行
Time: Sun Jun 2 08:33:35 2019
Time: Sun Jun 2 08:33:35 2019
手动执行
# 把字符串转化成十进制数字
int("12345")
# help(int)
# 求八进制的字符串12345,表示成十进制的数字是多少
int("12345", base=8)
5349
# 新建一个函数,此函数是默认输入的字符串是16进制数字
# 把此字符串返回十进制的数字
def int16(x, base=16):
return int(x, base)
int16("12345")
74565
import functools
# 实现上面int16的功能
int16 = functools.partial(int, base=16)
int16("12345")
74565
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。