一 函数式编程

  1. 不修改外部状态。
  2. 模仿数学里得函数进行编程。
  3. 用函数编程写出得代码相当精简。
  4. 可读性比较差。

例子:

  1. y=2*x+1
  2.  
  3. x=1
  4. def test(x):
  5. return 2*x+1
  6. test(x)

一 匿名函数

  • 匿名函数就是不需要显式的指定函数。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lamba表达式中封装有限的逻辑进去。

注:匿名函数引用计数为0,lambda经常和内置函数一起使用

  lambda/filter/map/reduce这些都是函数式编程的风格。

语法:
lambda函数的语法只包含一个语句,如下:

  1. lambda [arg1 [,arg2,.....argn]]:expression

先来个简单得:

  1. #这段代码
  2. def calc(n):
  3. return n**n
  4. print(calc(10))
  5.  
  6. #换成匿名函数
  7. calc = lambda n:n**n
  8. print(calc(10))

换个高级点得:

  1. salaries={
  2. 'egon':3000,
  3. 'alex':100000000,
  4. 'wupeiqi':10000,
  5. 'yuanhao':250
  6. }
  7.  
  8. def get_value(k):
  9. return salaries[k]
  10.  
  11. #换成匿名函数:
  12. lambda k:salaries[k]
  13. f=lambda k:salaries[k] #匿名函数也可以赋值一个名字,但是这便违反了匿名的初衷
  14. print(f)
  15. print(f('egon'))
  16.  
  17. print(max(salaries))
  18. print(max(salaries,key=get_value))
  19. print(max(salaries,key=lambda k:salaries[k]))
  20. print(min(salaries,key=lambda k:salaries[k]))

二 内置函数

官方文档,内置参数详解:

https://docs.python.org/3/library/functions.html?highlight=built#ascii

数据类型内置函数,又称为工厂函数。

函数是个具体的对象,谁来调用都可以用。方法需要绑定到具体对象。

  1. l1=[]
  2. l1.append('aaaa')
  3.  
  4. def test(x,item):
  5. x.append(item)
  6. test(b,'bbbbb')

函数例子

内置函数使用示例:

1、abs绝对值

  1. print(abs(-1))
  2. print(abs(0))

执行结果:

  1. 1
  2. 0

2、all所有的都为真,它才为真

  1. print(all(' ')) #注意all(' ')和all('')的区别,一个是空字符串,一个是空
  2. print(all('')) #如果可迭代对象是空,就返回True。
  3. print(all((1,' ',2)))
  4. print(all((1,'',2)))
  5. print(all((1,' ',2,None)))
  6. print(all(i for i in range(1,10)))

执行结果:

  1. True
  2. True
  3. True
  4. False
  5. False
  6. True

3、any集合中的元素有一个为真的时候为真,特别的,若为空串返回为False

  1. print(any([]))
  2. print(any([0,'',None,{},1]))

执行结果:

  1. False
  2. True

4、bin把十进制转成二进制

  1. print(bin(3))

执行结果:

  1. 0b11

5、bool布尔值 空,None,0的布尔值为False

  1. print(bool(0))
  2. print(bool(None))
  3. print(bool(''))
  4. print(bool([]))

执行结果:

  1. False
  2. False
  3. False
  4. False

6、bytes把字符串转成字节

ps1:

  1. name='你好'
  2. print(bytes(name,encoding='utf-8'))
  3. print(bytes(name,encoding='utf-8').decode('utf-8'))

执行结果:

  1. b'\xe4\xbd\xa0\xe5\xa5\xbd'
  2. 你好

ps2:

  1. name='你好'
  2. print(bytes(name,encoding='gbk'))
  3. print(bytes(name,encoding='gbk').decode('gbk'))

执行结果:

  1. b'\xc4\xe3\xba\xc3'
  2. 你好

ps3: #ascll不能编码中文,会报错

  1. name='你好'
  2. print(bytes(name,encoding='ascii')) #ascii不能编码中文,会报错

执行结果:

  1. Traceback (most recent call last):
  2. File "C:/Users/Administrator/PycharmProjects/untitled/day25/test.py", line 21, in <module>
  3. print(bytes(name,encoding='ascii')) #ascii不能编码中文,会报错
  4. UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

7、ASCII码对应的编码:

ps1:

  1. print(chr(66)) #ascll 码对应的编码

执行结果:

  1. B

ps2:

  1. print(ord("B")) #ascll 码对应的编码

执行结果:

  1. 66

8、数据类型:

int #整型

  1. num=1 #num=int(1)
  2. print(type(num)) #查看num的类型
  3. print(isinstance(num,int)) #判断num是否为int类型

执行结果:

  1. <class 'int'>
  2. True
  1. print(num is 1) #is 是身份运算,根据id去判断身份

执行结果:

  1. True

其他数字类型:

float #浮点
bool #布尔
complex #复数

str #字符串

  1. x='money' #x=str('money')
  2. print(str(1))
  3. print(str({'a':1}))

执行结果:

  1. 1
  2. {'a': 1}

list #列表

  1. x=[]
  2. x=list(i for i in range(10))
  3. print(x)

执行结果:

  1. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

tuple #元组
dict #字典

  1. d={'a':1}
  2. d=dict(x=1,y=2,z=3)
  3. print(d)

执行结果:

  1. {'x': 1, 'y': 2, 'z': 3}

set #集合

  1. s={1,2,3,4,4}
  2. print(s)
  3. s.add(5)
  4. print(s)

执行结果:

  1. {1, 2, 3, 4}
  2. {1, 2, 3, 4, 5}

frozenset #不可变集合

  1. f=frozenset({1,2,3,4})
  2. print(type(f))

执行结果:

  1. <class 'frozenset'>

complex #复数

  1. x=complex(1-2j)
  2. print(x.real)
  3. print(x.imag)

执行结果:

  1. 1.0
  2. -2.0
  1. x=1-2j
  2. print(x.real)
  3. print(x.imag)

执行结果:

  1. 1.0
  2. -2.0

9、dir显示函数内置属性和方法:

  1. print(dir(dict)) #打印内置属性和方法

执行结果:

  1. ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
  2.  
  3. '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__',
  4.  
  5. '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__',
  6.  
  7. '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
  1. l=[]
  2. print(dir(l))

执行结果:

  1. ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
  2.  
  3. '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__',
  4.  
  5. '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__',
  6.  
  7. '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index',
  8.  
  9. 'insert', 'pop', 'remove', 'reverse', 'sort']

10、help 查看函数用法的说细信息

  1. print(help(sum))

执行结果:

  1. Help on built-in function sum in module builtins:
  2.  
  3. sum(iterable, start=0, /)
  4. Return the sum of a 'start' value (default: 0) plus an iterable of numbers
  5.  
  6. When the iterable is empty, return the start value.
  7. This function is intended specifically for use with numeric values and may
  8. reject non-numeric types.
  9.  
  10. None

11、divmod 取商得余数,用于做分页显示功能

  1. print(divmod(10,3)) #取商得余数,用于做分页显示

执行结果:

  1. (3, 1)

12、enumerate返回一个可枚举的对象,该对象的next()方法将返回一个tuple

  1. for i in enumerate(['a','b','c','d']):
  2. print(i)
  3. for i in enumerate({'x':1,'y':2}):
  4. print(i)

执行结果:

  1. (0, 'a')
  2. (1, 'b')
  3. (2, 'c')
  4. (3, 'd')
  5. (0, 'x')
  6. (1, 'y')

13、hash 可hash的数据类型即不可变数据类型,不可hash的数据类型即可变数据类型

  1. print(hash('123abc'))
  2. print(hash('123abcd'))
  3. name='alex'
  4. print(hash(name))
  5. print('--->before',hash(name))
  6. name='sb'
  7. print('--->after',hash(name))

执行结果:

  1. 1142581611408458944
  2. 5571539217676805375
  3. 2895136519908427636
  4. --->before 2895136519908427636
  5. --->after -2600704963542853119

14、bin、hex、oct进制转换

  1. print(bin(10)) #10进制->2进制
  2. print(hex(12)) #10进制->16进制
  3. print(oct(12)) #10进制->8进制

15、id 返回对象的唯一标识id(object)

  1. print(id('abc'))
  2. a=1
  3. b=2
  4. print(id(a))
  5. print(id(b))
  6. x='a'
  7. y='b'
  8. print(id(x))
  9. print(id(y))
  10. print(x is y)

执行结果:

  1. 31023032
  2. 1589421152
  3. 1589421184
  4. 30945832
  5. 30931800
  6. False

16、max和min 最大值和最小值

  1. print(max(1,2,3,4,10,3))
  2. print(min(1,2,3,4,10,3))

执行结果:

  1. 10
  2. 1

17、zip拉链,将对象逐一配对

  1. l1=[1,2,3,4]
  2. s='hel'
  3. for i in zip(l1,s):
  4. print(i)
  5. print(max((1,'a'),(1,'b')))
  6.  
  7. salaries={
  8. 'egon':3000,
  9. 'alex':100000000,
  10. 'wupeiqi':10000,
  11. 'yuanhao':250
  12. }
  13. print(salaries.keys(),salaries.values())
  14. z=zip(salaries.values(),salaries.keys())
  15. print(z)
  16. for i in z:
  17. print(i)

执行结果:

  1. (1, 'h')
  2. (2, 'e')
  3. (3, 'l')
  4. (1, 'b')
  5. dict_keys(['egon', 'alex', 'wupeiqi', 'yuanhao']) dict_values([3000, 100000000, 10000, 250])
  6. <zip object at 0x00000000021BCF88>
  7. (3000, 'egon')
  8. (100000000, 'alex')
  9. (10000, 'wupeiqi')
  10. (250, 'yuanhao')

18、sorted排序

  1. l={3,4,1,0,9,10}
  2. print(sorted(l)) #返回值是列表,默认是升序
  3. print(sorted(l,reverse=True)) #降序排列
  4. s='hello abc'
  5. print(sorted(s))
  6.  
  7. salaries={
  8. 'egon':3000,
  9. 'alex':100000000,
  10. 'wupeiqi':10000,
  11. 'yuanhao':250
  12. }
  13. print(sorted(salaries)) #默认是按照字典salaries的key去排序的
  14. print(sorted(salaries,key=lambda x:salaries[x]))
  15. print(sorted(salaries,reverse=True,key=lambda x:salaries[x]))

执行结果:

  1. [0, 1, 3, 4, 9, 10]
  2. [10, 9, 4, 3, 1, 0]
  3. [' ', 'a', 'b', 'c', 'e', 'h', 'l', 'l', 'o']
  4.  
  5. ['alex', 'egon', 'wupeiqi', 'yuanhao']
  6. ['yuanhao', 'egon', 'wupeiqi', 'alex']
  7. ['alex', 'wupeiqi', 'egon', 'yuanhao']

排序且修改:

  1. l=[3,2,0,10]
  2. l=sorted(l)
  3. print(l)

执行结果:

  1. [0, 2, 3, 10]

19、map映射,map(function,iterable,...)遍历每个元素,执行function操作

  1. l=[1,2,3,7,5]
  2. x={i**2 for i in l}
  3. print(x)
  4. iterm=2
  5. m=map(lambda item:item**2,l)
  6. print(m)
  7. for i in m:
  8. print(i)
  9. print(list(m))
  10.  
  11. name_1=['alex','yuanhao','wupeiqi']
  12. m=map(lambda name:name+'SB',name_1)
  13. print(list(m))

执行结果:

  1. {1, 4, 9, 49, 25}
  2. <map object at 0x00000000028099B0>
  3. 1
  4. 4
  5. 9
  6. 49
  7. 25
  8. []
  9. ['alexSB', 'yuanhaoSB', 'wupeiqiSB']

20、reduce 合并操作,从第一个开始是前两个参数,然后是前两个的结果与第三个合并进行处理,以此类推。

reduce(function,iterable[,initializer])

  1. from functools import reduce #合并
  2. l=list(range(100))
  3. print(l)
  4. print(reduce(lambda x,y:x+y,l,100))
  5. i=iter(l)
  6. # 100 next(i) --->100,0----->x,y-x+y-->100
  7. # 100 next(i)---->100,1----->x,y--x+y-->101
  8. # 101 next(i)----->101,2

执行结果:

  1. [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,
  2.  
  3. 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,
  4.  
  5. 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]
  6. 5050

21、filter过滤

  1. name_l=[
  2. {'name':'egon','age':18},
  3. {'name':'alex','age':1000},
  4. {'name':'wupeiqi','age':9000},
  5. {'name':'yuanhao','age':10000},
  6. ]
  7.  
  8. f=filter(lambda d:d['age'] > 100,name_l)
  9. print(f)
  10. for i in f:
  11. print(i)

执行结果:

  1. <filter object at 0x00000000027A9BA8>
  2. {'name': 'alex', 'age': 1000}
  3. {'name': 'wupeiqi', 'age': 9000}
  4. {'name': 'yuanhao', 'age': 10000}

22、pow 几的几次方

  1. print(pow(3,2,2)) #3**3%2 3的3次方,取余
  2. print(pow(3,3)) #3**3 几的几次方,相当于3的3次方

执行结果:

  1. 1
  2. 27

23、reversed 反转

  1. print(list(reversed([1,5,3,9])))

执行结果:

  1. [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)

  1. print(round(2.6))
  2. print(round(2.5))
  3. print(round(3.4))
  4. print(round(3.5))

执行结果:

  1. 3
  2. 2
  3. 3
  4. 4

25、slice 切片

  1. l=[1,2,3,4,5,6]
  2. print(l[2:5:2])
  3. s=slice(2,5,2)
  4. print(l[s])

执行结果:

  1. [3, 5]
  2. [3, 5]

26、vars跟一个列表或多个字典

  1. print(vars())
  2. print(vars() is locals())

执行结果:

  1. {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at
  2.  
  3. 0x000000000068A358>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__':
  4.  
  5. 'C:/Users/Administrator/PycharmProjects/untitled/day25/test.py', '__cached__': None}
  6. True

27、import模块

1、先创建一个test.py文件
写入内容如下:

  1. def say_hi():
  2. print('你好啊egon')

2、再调用这个模块

  1. import test #写入一个模块,模块就是一个py文件
  2. test.say_hi()

执行结果:

  1. 你好啊egon

28、__import__: 导入一个字符串类型模块,就要用__import__

1、先创建一个test.py文件
写入内容如下:

  1. def say_hi():
  2. print('你好啊egon')

2、再调用这个模块

  1. module_name='test'
  2. m=__import__(module_name)
  3. m.say_hi()

执行结果:

  1. 你好啊egon

其他内容,在面向对象里讲:

  1. classmethod
  2. staticmethod
  3. property
  4.  
  5. delattr
  6. hasattr
  7. getattr
  8. setattr
  9.  
  10. issubclass
  11. super

其他内置函数

练习题:

作业一、

1、用map来处理字符串列表啊,把列表中所有人都变成sb,比方alex_sb

  name=['alex','wupeiqi','yuanhao']

  1. m=map(lambda name:name+'_sb',name)
  2. print(list(m))

2、用map来处理下述l,然后用list得到一个新的列表,列表中每个人的名字都是sb结尾

  l=[{'name':'alex'},{'name':'y'}]

  1. 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,
}

  1. res=filter(lambda x:shares[x]>20,shares)
  2. print(list(res))
  3. 或者
  4. for i in res:
  5. 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来得出一个包含数字的迭代器,数字指的是:购买每支股票的总价格

  1. res=map(lambda x:x['shares']*x['price'],portfolio)
  2. print(list(res))
  3. 或者
  4. for i in res:
  5. print(i)

2、基于1的结果,用reduce来计算,购买这些股票总共花了多少钱

  1. l1=[]
  2. res=map(lambda x:x['shares']*x['price'],portfolio)
  3. print(list(res))
  4. 或者
  5. for i in res:
  6. l1.append(i)
  7.  
  8. res=reduce(lambda x,y:x+y,l1)
  9. print(res)

3、用filter过滤出,单价大于100的股票有哪些

  1. res=filter(lambda x:x["price"]>100,portfolio)
  2. for i in res:
  3. print(i)

python基础之函数式编程、匿名函数、内置函数的更多相关文章

  1. python基础之递归,匿名,内置函数

    递归函数: 什么是递归函数? 函数递归调用:在调用一个函数的过程中,又直接或间接地调用了该函数本身. 递归必须要有两个明确的阶段: ①递推:一层一层递归调用下去,强调:每进入下一层问题规模减少 ②回溯 ...

  2. Python基础学习参考(三):内置函数

    一:内置函数 在第一篇文章中,我们简单的认识了一下print()函数和input()函数,也就是输入和输出,这些函数我们可以直接的调用,不要自己定义或者引入什么,对吧?想这样的函数就叫做内置函数.这里 ...

  3. python基础-第四篇-4.1内置函数

    lambda表达式 lambda表达式是对简单函数的精简化表达 语法结构:函数名 = lambda:运算表达式 def f1(a): a = a + 1 return a ret = f1(1) pr ...

  4. python基础语法20 面向对象5 exec内置函数的补充,元类,属性查找顺序

    exec内置函数的补充 exec: 是一个python内置函数,可以将字符串的代码添加到名称空间中; - 全局名称空间 - 局部名称空间 exec(字符串形式的代码, 全局名称空间, 局部名称空间) ...

  5. Python基础:函数式编程

    一.概述 Python是一门多范式的编程语言,它同时支持过程式.面向对象和函数式的编程范式.因此,在Python中提供了很多符合 函数式编程 风格的特性和工具. 以下是对 Python中的函数式编程 ...

  6. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  7. python 匿名函数&内置函数

    匿名函数:为了解决那些功能很简单的需求而设计的一句话函数怎么定义匿名函数: cal = lambda x : x*x # cal是函数名,lambda是定义匿名函数的关键字 冒号前面的额x是参数即函数 ...

  8. py基础3--函数,递归,内置函数

    本节内容 函数基本语法及特性 参数与局部变量 返回值 嵌套函数 递归 匿名函数 函数式编程介绍 高阶函数 内置函数 1. 函数基本语法及特性 背景提要 现在老板让你写一个监控程序,监控服务器的系统状况 ...

  9. Python学习笔记014——迭代工具函数 内置函数enumerate()

    1 描述 enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. 2 语法 enumerate(sequ ...

  10. python 函数--内置函数

    一.内置函数 内置函数是python自带的一系列常用函数. 二.python3中内置函数     内置功能     abs() delattr() hash() memoryview() set() ...

随机推荐

  1. 1077. Kuchiguse (20)【字符串处理】——PAT (Advanced Level) Practise

    题目信息 1077. Kuchiguse (20) 时间限制100 ms 内存限制65536 kB 代码长度限制16000 B The Japanese language is notorious f ...

  2. mysql的优化:官网地址

    http://dev.mysql.com/doc/refman/5.1/zh/optimization.html#index-merge-optimization

  3. TMS320F28335项目开发记录3_28335简介

    28335特性介绍 高性能静态CMOS技术         高达150MHZ(6.67ns的周期时间):1.9V / 1.8内核 ,3.3V I/O设计 高性能32位CPU         IEEE- ...

  4. 【Python】多线程2

    threading模块 import time import random import threading class Inclass: def __init__(self): print 'Inc ...

  5. 使用ADO实现BLOB数据的存取 -- ADO开发实践之二

    使用ADO实现BLOB数据的存取 -- ADO开发实践之二 http://www.360doc.com/content/11/0113/16/4780948_86256633.shtml 一.前言 在 ...

  6. oracle_存储过程_有参数_获取部门装置层级树

    create or replace procedure P_UTIL_TREE(P_APPL_NAME in VARCHAR2, P_HIERARCHY_TYP in VARCHAR2, TREETY ...

  7. java图形化Swing教程(一)

    与多线程.泛型等不同,Swing主要在于使用. 以下主要放代码和凝视.少说话. (一)基本框架 package Swing; import java.awt.*; import javax.swing ...

  8. C++第15周(春)项目3 - OOP版电子词典(二)

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目3-OOP版电子词典](本程序须要的相关 ...

  9. ios iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)

    iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势) 转自容芳志大神的博客:http://www.cnblogs.com/stoic/archive/2013/02/27/2940 ...

  10. /etc/hostname

    我们可以使用 hostname 命令来修改主机名,但只是临时生效,如果想永久生效可以编辑 /etc/hostname 文件,注意不是每个 Linux 发行版都有该文件 root@Ubuntu_Lee: ...