一 函数式编程

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

例子:

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基础之函数式编程、匿名函数、内置函数的更多相关文章

  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. 在 Mac 上搭建 Nginx PHP Mysql 开发环境

    事实上这个过程跟Linux下安装都几乎相同,仅仅是部分命令有区别,大同小异. 网上看到非常多教程都是用 brew 之类的包管理器安装,可是 Mac 自带了 php , 难道还要再装一个第三方的?强迫症 ...

  2. bedtools 的安装与使用

    1) 安装 bedtools 提供了3种安装方式 从google code 下载源代码进行安装 利用系统中的包管理工具进行安装, 比如cnetos 下的yum, ubuntu下的apt-get, ma ...

  3. 本来想用jsonp来跨域请求的,但sb写接口的,不改返回值。。。只得在后台请求接口了。。。

    string url = "ssss.com";//demo里的是get请求 HttpWebResponse w = HttpHelper.CreateGetHttpRespons ...

  4. [渗透技巧] Windows命令行下载

    certutil简介 用于证书管理 支持环境: XP  -  Windows 10 全系统 更多:https://technet.microsoft.com/zh-cn/library/cc75534 ...

  5. window设置TortoiseGit连接git不用每次输入用户名和密码

    1. 在Windows中添加一个HOME环境变量,值为%USERPROFILE%,如下图: 2. 在“开始>运行(快捷键:win+r)”中打开%Home%,然后在目录下新建一个名为“_netrc ...

  6. css两列等高布局

    布局方案 等高布局有几种不同的方法,但目前为止我认为浏览器兼容最好最简便的应该是padding补偿法.首先把列的padding-bottom设为一个足够大的值,再把列的margin-bottom设一个 ...

  7. ROS文件系统介绍--2

    ros初级核心教程--ROS文件系统介绍(原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/) 1.ROS文件系统介绍: 1.1.预备工作:本教程中 ...

  8. C# CRC16 查表法

    private static ushort[] crctab = new ushort[256]{                      0x0000, 0x1021, 0x2042, 0x306 ...

  9. easyui------自动合并行

    转载: http://www.cnblogs.com/xiangzhong/p/5088259.html#undefined 1.引入插件 $.extend($.fn.datagrid.methods ...

  10. 2014年辛星解读Javascript之DOM之事件及其绑定

    我们通过DOM的事件能够对HTML的事件作出反应.就像我们用其它编程语言写GUI一样,那么HTML包含哪些事件呢?以下是几个常见的样例,比方网页已经完毕记载,图像完毕载入,鼠标移动到元素上方.输入文字 ...