python基础之函数式编程、匿名函数、内置函数
一 函数式编程
- 不修改外部状态。
- 模仿数学里得函数进行编程。
- 用函数编程写出得代码相当精简。
- 可读性比较差。
例子:
y=2*x+1 x=1
def test(x):
return 2*x+1
test(x)
一 匿名函数
- 匿名函数就是不需要显式的指定函数。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lamba表达式中封装有限的逻辑进去。
注:匿名函数引用计数为0,lambda经常和内置函数一起使用
lambda/filter/map/reduce这些都是函数式编程的风格。
语法:
lambda函数的语法只包含一个语句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
先来个简单得:
#这段代码
def calc(n):
return n**n
print(calc(10)) #换成匿名函数
calc = lambda n:n**n
print(calc(10))
换个高级点得:
salaries={
'egon':3000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':250
} def get_value(k):
return salaries[k] #换成匿名函数:
lambda k:salaries[k]
f=lambda k:salaries[k] #匿名函数也可以赋值一个名字,但是这便违反了匿名的初衷
print(f)
print(f('egon')) print(max(salaries))
print(max(salaries,key=get_value))
print(max(salaries,key=lambda k:salaries[k]))
print(min(salaries,key=lambda k:salaries[k]))
二 内置函数
官方文档,内置参数详解:
https://docs.python.org/3/library/functions.html?highlight=built#ascii
数据类型内置函数,又称为工厂函数。
函数是个具体的对象,谁来调用都可以用。方法需要绑定到具体对象。
l1=[]
l1.append('aaaa') def test(x,item):
x.append(item)
test(b,'bbbbb')
函数例子
内置函数使用示例:
1、abs绝对值
print(abs(-1))
print(abs(0))
执行结果:
1
0
2、all所有的都为真,它才为真
print(all(' ')) #注意all(' ')和all('')的区别,一个是空字符串,一个是空
print(all('')) #如果可迭代对象是空,就返回True。
print(all((1,' ',2)))
print(all((1,'',2)))
print(all((1,' ',2,None)))
print(all(i for i in range(1,10)))
执行结果:
True
True
True
False
False
True
3、any集合中的元素有一个为真的时候为真,特别的,若为空串返回为False
print(any([]))
print(any([0,'',None,{},1]))
执行结果:
False
True
4、bin把十进制转成二进制
print(bin(3))
执行结果:
0b11
5、bool布尔值 空,None,0的布尔值为False
print(bool(0))
print(bool(None))
print(bool(''))
print(bool([]))
执行结果:
False
False
False
False
6、bytes把字符串转成字节
ps1:
name='你好'
print(bytes(name,encoding='utf-8'))
print(bytes(name,encoding='utf-8').decode('utf-8'))
执行结果:
b'\xe4\xbd\xa0\xe5\xa5\xbd'
你好
ps2:
name='你好'
print(bytes(name,encoding='gbk'))
print(bytes(name,encoding='gbk').decode('gbk'))
执行结果:
b'\xc4\xe3\xba\xc3'
你好
ps3: #ascll不能编码中文,会报错
name='你好'
print(bytes(name,encoding='ascii')) #ascii不能编码中文,会报错
执行结果:
Traceback (most recent call last):
File "C:/Users/Administrator/PycharmProjects/untitled/day25/test.py", line 21, in <module>
print(bytes(name,encoding='ascii')) #ascii不能编码中文,会报错
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
7、ASCII码对应的编码:
ps1:
print(chr(66)) #ascll 码对应的编码
执行结果:
B
ps2:
print(ord("B")) #ascll 码对应的编码
执行结果:
66
8、数据类型:
int #整型
num=1 #num=int(1)
print(type(num)) #查看num的类型
print(isinstance(num,int)) #判断num是否为int类型
执行结果:
<class 'int'>
True
print(num is 1) #is 是身份运算,根据id去判断身份
执行结果:
True
其他数字类型:
float #浮点
bool #布尔
complex #复数
str #字符串
x='money' #x=str('money')
print(str(1))
print(str({'a':1}))
执行结果:
1
{'a': 1}
list #列表
x=[]
x=list(i for i in range(10))
print(x)
执行结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
tuple #元组
dict #字典
d={'a':1}
d=dict(x=1,y=2,z=3)
print(d)
执行结果:
{'x': 1, 'y': 2, 'z': 3}
set #集合
s={1,2,3,4,4}
print(s)
s.add(5)
print(s)
执行结果:
{1, 2, 3, 4}
{1, 2, 3, 4, 5}
frozenset #不可变集合
f=frozenset({1,2,3,4})
print(type(f))
执行结果:
<class 'frozenset'>
complex #复数
x=complex(1-2j)
print(x.real)
print(x.imag)
执行结果:
1.0
-2.0
x=1-2j
print(x.real)
print(x.imag)
执行结果:
1.0
-2.0
9、dir显示函数内置属性和方法:
print(dir(dict)) #打印内置属性和方法
执行结果:
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
l=[]
print(dir(l))
执行结果:
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
10、help 查看函数用法的说细信息
print(help(sum))
执行结果:
Help on built-in function sum in module builtins: sum(iterable, start=0, /)
Return the sum of a 'start' value (default: 0) plus an iterable of numbers When the iterable is empty, return the start value.
This function is intended specifically for use with numeric values and may
reject non-numeric types. None
11、divmod 取商得余数,用于做分页显示功能
print(divmod(10,3)) #取商得余数,用于做分页显示
执行结果:
(3, 1)
12、enumerate返回一个可枚举的对象,该对象的next()方法将返回一个tuple
for i in enumerate(['a','b','c','d']):
print(i)
for i in enumerate({'x':1,'y':2}):
print(i)
执行结果:
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(0, 'x')
(1, 'y')
13、hash 可hash的数据类型即不可变数据类型,不可hash的数据类型即可变数据类型
print(hash('123abc'))
print(hash('123abcd'))
name='alex'
print(hash(name))
print('--->before',hash(name))
name='sb'
print('--->after',hash(name))
执行结果:
1142581611408458944
5571539217676805375
2895136519908427636
--->before 2895136519908427636
--->after -2600704963542853119
14、bin、hex、oct进制转换
print(bin(10)) #10进制->2进制
print(hex(12)) #10进制->16进制
print(oct(12)) #10进制->8进制
15、id 返回对象的唯一标识id(object)
print(id('abc'))
a=1
b=2
print(id(a))
print(id(b))
x='a'
y='b'
print(id(x))
print(id(y))
print(x is y)
执行结果:
31023032
1589421152
1589421184
30945832
30931800
False
16、max和min 最大值和最小值
print(max(1,2,3,4,10,3))
print(min(1,2,3,4,10,3))
执行结果:
10
1
17、zip拉链,将对象逐一配对
l1=[1,2,3,4]
s='hel'
for i in zip(l1,s):
print(i)
print(max((1,'a'),(1,'b'))) salaries={
'egon':3000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':250
}
print(salaries.keys(),salaries.values())
z=zip(salaries.values(),salaries.keys())
print(z)
for i in z:
print(i)
执行结果:
(1, 'h')
(2, 'e')
(3, 'l')
(1, 'b')
dict_keys(['egon', 'alex', 'wupeiqi', 'yuanhao']) dict_values([3000, 100000000, 10000, 250])
<zip object at 0x00000000021BCF88>
(3000, 'egon')
(100000000, 'alex')
(10000, 'wupeiqi')
(250, 'yuanhao')
18、sorted排序
l={3,4,1,0,9,10}
print(sorted(l)) #返回值是列表,默认是升序
print(sorted(l,reverse=True)) #降序排列
s='hello abc'
print(sorted(s)) salaries={
'egon':3000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':250
}
print(sorted(salaries)) #默认是按照字典salaries的key去排序的
print(sorted(salaries,key=lambda x:salaries[x]))
print(sorted(salaries,reverse=True,key=lambda x:salaries[x]))
执行结果:
[0, 1, 3, 4, 9, 10]
[10, 9, 4, 3, 1, 0]
[' ', 'a', 'b', 'c', 'e', 'h', 'l', 'l', 'o'] ['alex', 'egon', 'wupeiqi', 'yuanhao']
['yuanhao', 'egon', 'wupeiqi', 'alex']
['alex', 'wupeiqi', 'egon', 'yuanhao']
排序且修改:
l=[3,2,0,10]
l=sorted(l)
print(l)
执行结果:
[0, 2, 3, 10]
19、map映射,map(function,iterable,...)遍历每个元素,执行function操作
l=[1,2,3,7,5]
x={i**2 for i in l}
print(x)
iterm=2
m=map(lambda item:item**2,l)
print(m)
for i in m:
print(i)
print(list(m)) name_1=['alex','yuanhao','wupeiqi']
m=map(lambda name:name+'SB',name_1)
print(list(m))
执行结果:
{1, 4, 9, 49, 25}
<map object at 0x00000000028099B0>
1
4
9
49
25
[]
['alexSB', 'yuanhaoSB', 'wupeiqiSB']
20、reduce 合并操作,从第一个开始是前两个参数,然后是前两个的结果与第三个合并进行处理,以此类推。
reduce(function,iterable[,initializer])
from functools import reduce #合并
l=list(range(100))
print(l)
print(reduce(lambda x,y:x+y,l,100))
i=iter(l)
# 100 next(i) --->100,0----->x,y-x+y-->100
# 100 next(i)---->100,1----->x,y--x+y-->101
# 101 next(i)----->101,2
执行结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
5050
21、filter过滤
name_l=[
{'name':'egon','age':18},
{'name':'alex','age':1000},
{'name':'wupeiqi','age':9000},
{'name':'yuanhao','age':10000},
] f=filter(lambda d:d['age'] > 100,name_l)
print(f)
for i in f:
print(i)
执行结果:
<filter object at 0x00000000027A9BA8>
{'name': 'alex', 'age': 1000}
{'name': 'wupeiqi', 'age': 9000}
{'name': 'yuanhao', 'age': 10000}
22、pow 几的几次方
print(pow(3,2,2)) #3**3%2 3的3次方,取余
print(pow(3,3)) #3**3 几的几次方,相当于3的3次方
执行结果:
1
27
23、reversed 反转
print(list(reversed([1,5,3,9])))
执行结果:
[9, 3, 5, 1]
24、round 四舍五入
当数字n是两个相邻整数的中间值(例如 1.5、2.5、3.5和4.5)时,round函数将返回与其最为接近的偶数。
例如,round(2.5)的结果是2,而round(3.5)的结果是4。
decimal的默认context是"四舍六入五留双"。(只针对python3.x)
print(round(2.6))
print(round(2.5))
print(round(3.4))
print(round(3.5))
执行结果:
3
2
3
4
25、slice 切片
l=[1,2,3,4,5,6]
print(l[2:5:2])
s=slice(2,5,2)
print(l[s])
执行结果:
[3, 5]
[3, 5]
26、vars跟一个列表或多个字典
print(vars())
print(vars() is locals())
执行结果:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000000068A358>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/PycharmProjects/untitled/day25/test.py', '__cached__': None}
True
27、import模块
1、先创建一个test.py文件
写入内容如下:
def say_hi():
print('你好啊egon')
2、再调用这个模块
import test #写入一个模块,模块就是一个py文件
test.say_hi()
执行结果:
你好啊egon
28、__import__: 导入一个字符串类型模块,就要用__import__
1、先创建一个test.py文件
写入内容如下:
def say_hi():
print('你好啊egon')
2、再调用这个模块
module_name='test'
m=__import__(module_name)
m.say_hi()
执行结果:
你好啊egon
其他内容,在面向对象里讲:
classmethod
staticmethod
property delattr
hasattr
getattr
setattr issubclass
super
其他内置函数
练习题:
作业一、
1、用map来处理字符串列表啊,把列表中所有人都变成sb,比方alex_sb
name=['alex','wupeiqi','yuanhao']
m=map(lambda name:name+'_sb',name)
print(list(m))
2、用map来处理下述l,然后用list得到一个新的列表,列表中每个人的名字都是sb结尾
l=[{'name':'alex'},{'name':'y'}]
print(list(map(lambda i:{'name':i['name']+"sb"},l)))
作业二:
1、用filter来处理,得到股票价格大于20的股票名字
shares={
'IBM':36.6,
'Lenovo':23.2,
'oldboy':21.2,
'ocean':10.2,
}
res=filter(lambda x:shares[x]>20,shares)
print(list(res))
或者
for i in res:
print(i)
作业三:
如下,每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09},
{'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': 'YHOO', 'shares': 45, 'price': 16.35},
{'name': 'ACME', 'shares': 75, 'price': 115.65}
]
1、map来得出一个包含数字的迭代器,数字指的是:购买每支股票的总价格
res=map(lambda x:x['shares']*x['price'],portfolio)
print(list(res))
或者
for i in res:
print(i)
2、基于1的结果,用reduce来计算,购买这些股票总共花了多少钱
l1=[]
res=map(lambda x:x['shares']*x['price'],portfolio)
print(list(res))
或者
for i in res:
l1.append(i) res=reduce(lambda x,y:x+y,l1)
print(res)
3、用filter过滤出,单价大于100的股票有哪些
res=filter(lambda x:x["price"]>100,portfolio)
for i in res:
print(i)
python基础之函数式编程、匿名函数、内置函数的更多相关文章
- python基础之递归,匿名,内置函数
递归函数: 什么是递归函数? 函数递归调用:在调用一个函数的过程中,又直接或间接地调用了该函数本身. 递归必须要有两个明确的阶段: ①递推:一层一层递归调用下去,强调:每进入下一层问题规模减少 ②回溯 ...
- Python基础学习参考(三):内置函数
一:内置函数 在第一篇文章中,我们简单的认识了一下print()函数和input()函数,也就是输入和输出,这些函数我们可以直接的调用,不要自己定义或者引入什么,对吧?想这样的函数就叫做内置函数.这里 ...
- python基础-第四篇-4.1内置函数
lambda表达式 lambda表达式是对简单函数的精简化表达 语法结构:函数名 = lambda:运算表达式 def f1(a): a = a + 1 return a ret = f1(1) pr ...
- python基础语法20 面向对象5 exec内置函数的补充,元类,属性查找顺序
exec内置函数的补充 exec: 是一个python内置函数,可以将字符串的代码添加到名称空间中; - 全局名称空间 - 局部名称空间 exec(字符串形式的代码, 全局名称空间, 局部名称空间) ...
- Python基础:函数式编程
一.概述 Python是一门多范式的编程语言,它同时支持过程式.面向对象和函数式的编程范式.因此,在Python中提供了很多符合 函数式编程 风格的特性和工具. 以下是对 Python中的函数式编程 ...
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
- python 匿名函数&内置函数
匿名函数:为了解决那些功能很简单的需求而设计的一句话函数怎么定义匿名函数: cal = lambda x : x*x # cal是函数名,lambda是定义匿名函数的关键字 冒号前面的额x是参数即函数 ...
- py基础3--函数,递归,内置函数
本节内容 函数基本语法及特性 参数与局部变量 返回值 嵌套函数 递归 匿名函数 函数式编程介绍 高阶函数 内置函数 1. 函数基本语法及特性 背景提要 现在老板让你写一个监控程序,监控服务器的系统状况 ...
- Python学习笔记014——迭代工具函数 内置函数enumerate()
1 描述 enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. 2 语法 enumerate(sequ ...
- python 函数--内置函数
一.内置函数 内置函数是python自带的一系列常用函数. 二.python3中内置函数 内置功能 abs() delattr() hash() memoryview() set() ...
随机推荐
- CentOS下screen 命令详解
一.背景 系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份.ftp 传输等等.通常情况下我们都是为每一个这样的任务开一个远 ...
- java web接口controller测试控制台输出乱码
接口上配置:
- Linux 域名服务器配置
cat /etc/redhat-release CentOS Linux release 7.0.1406 (Core) 使用BIND构建DNS服务器 1.BIND服务器安装 yum install ...
- CMD命令进入文件夹
cmd 进入E文件夹 E: 查看文件夹目录 dir 进入某个文件夹 cd 目录
- Java 应用程序设计规范
1.能在程序中取的产生就从程序中取.不用客户输入(减少客户输入). 比如客户号 信息 等. 2.如果有参数输入尽可能减少参数输入的个数(4个->0个): 3.验证入参(尽可能的实现输入参数的正确 ...
- Maven War包 POM配置文件
如何为你的Web程序(war包设定配置文件) 约定 http://maven.apache.org/plugins/maven-war-plugin/examples/adding-filtering ...
- layui时间,table,大图查看,弹出框,获取音频长度,文件上传
1.引入: <link href="../../Scripts/layui-v2.3.0/css/layui.css" rel="stylesheet" ...
- js 对象引用传值
1)当变量是一个对象(例如:{}或[]),使用 a = b = {} 这种形式传值的话,会变成会用传值,修改 a 时 b 会相应变化,修改 b 时 a 也一样会相应变化 var a = b = {}; ...
- Dotnet listview
属性----------------------------------------------------------------------------------------- .Access ...
- MYSQL系列之(一)
mysql简介 1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不 ...