python的高级应用

简介:

函数式编程

函数式编程是使用一系列函数去解决问题,按照一般编程思维,面对问题时我们的思考方式是“怎么干”,而函数函数式编程的思考方式是我要“干什么”。很多好用的函数很大程度节约了编程成本。

函数参数问题

总结来说就三种基本的情况:

  • fun(a,b)

  • fun(a,*b):b是可迭代对象

  • fun(a,**b):b是带有检索的迭代对象,在函数体内部解析的时候类似字典

其他的情况基本是上面的改动,注意fun(*a,**b)这种形式是任意参数。

ls = [i for i in range(10)]def fun1(a,*b):
    for i in b:        print(a,i)
fun1(1,*ls)def fun2(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
fun2('AsuraDong',12,参数="random")

匿名函数:lambda

  1. 没有return返回值,返回值就是表达式的值

  2. 函数没有名字,不必担心函数名冲突

  3. 匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数

fun = lambda x:x+1print(fun(5)) #6fun2 = lambda x,y:x*yprint(fun2(5,2)) #10

装饰器:@

这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。

没有参数的装饰器

# 定义一个装饰器def log(func):
    def wrapper(*args, **kw):
        print('call %s()' % func.__name__)        return func(*args, **kw)    return wrapper@logdef now():
    print('2015-3-25')
    
now()

注意装饰器的内部逻辑关系(调用顺序):log()->return wrapper -> wrapper() -> return func() -> now()

含参数的装饰器

def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))            return func(*args, **kw)        return wrapper    return decorator@log("可爱的参数")def now():
    print('2015-3-25')

进一步完善:保留函数的内置方法__name__不改变

如果调用now.__name__,得到的结果是wrapper而不是我们希望的now(本来函数的名字)。显然这与我们的初衷相背离。这是需要在wrapper前面加上functools库里的@functools.wraps(func)

import functoolsdef log(text):
    def decorator(func):        @functools.wraps(func)
        def wrapper(*args, **kw):            
            print('%s %s():' % (text, func.__name__))            return func(*args, **kw)        return wrapper    return decorator@log("可爱的参数")def now():
    print('2015-3-25')    
print(now.__name__)

装饰器用途

除了之前讲的可以让代码更容易理解之外(但是确实不好写),还有什么作用?本来我也觉得没啥用。。。直到后来接触NLTK,里面有一个@memorize装饰器,在递归的时候可以自动保留每次的结果,避免了手动去完善代码(可以去翻之前的博客)。所以用处还是很大的。


欢迎进一步交流本博文相关内容:

博客园地址 : http://www.cnblogs.com/AsuraDong/

CSDN地址 : http://blog.csdn.net/asuradong

也可以致信进行交流 : xiaochiyijiu@163.com 

欢迎转载 , 但请指明出处  :  )


BIF:内建的函数(built-in functions)

zip:将两个迭代对象合成一个迭代对象

注意:多余的没有匹配的迭代元素会被自动舍弃

a = [1,2,3]
b = 'avsss'for i in zip(a,b):    print(i)for i,j in zip(a,b):    print('Index:',i,"; Item:",j)

enumerate:返回的是迭代对象,由位置+元素构成

for i,j in enumerate(b):    print("Index:",i,":Item:",j)

filter:过滤函数

两个参数,第一个是函数,第二个是一个可迭代对象。返回的值是一个可迭代对象,其中的每个元素是参数中迭代对象的每个元素在参数中的函数返回值为True的元素。(有点乱,看代码)

list(filter(lambda m:m%2==0,range(1,6)))

结果是[2,4]

map:映射函数

用法和filter类似,区别如下:

  • 参数里面的函数作用是对迭代对象每个元素操作

  • 返回的被操作过的迭代对象

list(map(lambda m:m**2,range(1,6)))

结果是[1, 4, 9, 16, 25]

reduce

  • 在functools库里

  • func接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

#一道经典的1+2+..+100的例题from functools import reduceadd = lambda x,y : x+y

ls = [i for i in range(1,101)]print(reduce(add,ls))

sorted:排序函数

非常重要,主要是在对参数的调整上做工作,甚至可以实现对类对象的排序。

基本排序和倒序

默认的排序是从小到大,如果需要从大到小,那么应该修改reverse参数为True

print(sorted([-1,0,-100],reverse = True))print(sorted([-1,0,-100]))

key参数

key参数来指定一个函数,此函数将在每个元素比较前被调用。

sorted([-1,0,-100],key = abs,reverse = True)#对绝对值的大小进行排序student_tuples = [
        ('john', 'A', 15),
        ('jane', 'B', 12),
        ('dave', 'B', 10),
]print(sorted(student_tuples, key=lambda student: student[2])) #按数字排序

按照这个思路,可以实现对类的排序。当然这是根据类中的某一类元素来进行的。

class Student:
        def __init__(self, name, grade, age):
                self.name = name                self.grade = grade                self.age = age        def __repr__(self):
                return repr((self.name, self.grade, self.age))
            
student_objects = [
        Student('john', 'A', 15),
        Student('jane', 'B', 12),
        Student('dave', 'B', 10),
]sorted(student_objects, key=lambda student: student.age)

多级排序

如果你想根据类里面的多个元素或者迭代对象中的多个元素来排序,那么就需要operator库里面的两个函数。应该注意的是它们的参数对应的是名字还是位置。并且排序为了避免二义性,都是先以第一个参数为基础依次进行排序。

from operator import itemgetter,attrgetterclass Student:
        def __init__(self, name, grade, age):
                self.name = name                self.grade = grade                self.age = age        def __repr__(self):
                return repr((self.name, self.grade, self.age))
            
student_objects = [
        Student('john', 'A', 15),
        Student('jane', 'B', 12),
        Student('dave', 'B', 10),
]
student_tuples = [
        ('john', 'A', 15),
        ('jane', 'B', 12),
        ('dave', 'B', 10),
]print(sorted(student_objects, key=attrgetter('name','age'))) 
print(sorted(student_tuples, key=itemgetter(1,2)))

高级官方库

itertools

itertools模块提供的全部是处理迭代功能的函数,它们的返回值不是list,而是Iterator,只有用for循环迭代的时候才真正计算

itertools.count(start=0,step=1)

默认是从0开始,间隔为1。

import itertools
natuals = itertools.count(0)for i in natuals:    print (i)

这段代码会一直打印下去,直到遇到终止。

itertools.cycle(iterator)

将iterator中的元素无限循环下去。

cc = itertools.cycle('456')for c in cc:    print(c)

itertools.repeat(obj[,最大重复次数])

将obj默认无限重复。

np = itertools.repeat('1A.', 3)for i in np:    print(i)

itertools.chain(a,b,..,n,...)

将迭代器abc串联起来,形成一个新的迭代器。

a = [1,2]
b =[3,4]for i in itertools.chain(a,b):    print(i)

c = {"fef":1}for i in itertools.chain(a,b,c):    print(i)

itertools.groupby(iterator)

将iterator中相邻的重复元素挑出来。所以,如果想对一个迭代对象查找不重复的元素,可以县排序,再调用这个方法。

for i in itertools.groupby('ABCA'):    print(i)

itertools.takewhile(func,iterator)

无限序列虽然可以无限迭代下去,但是通常我们会通过takewhile()等函数根据条件判断来截取出一个有限的序列

natuals = itertools.count(1)
ns = itertools.takewhile(lambda x :x<=10,natuals)print(list(ns))

组合生成器

迭代器 参数 结果
product() p, q, ... [repeat=1] cartesian product, equivalent to a nested for-loop
permutations() p[, r] r-length tuples, all possible orderings, no repeated elements
combinations() p, r r-length tuples, in sorted order, no repeated elements
combinations_with_replacement() p, r r-length tuples, in sorted order, with repeated elements
product('ABCD', repeat=2)
AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD
permutations('ABCD', 2)
AB AC AD BA BC BD CA CB CD DA DB DC
combinations('ABCD', 2)
AB AC AD BC BD CD
combinations_with_replacement('ABCD', 2)
AA AB AC AD BB BC BD CC CD DD

collections

里面收集了很多常用的数据结构,例如计数器、队列、顺序字典等等。而这些很多继承于基本的数据结构,所以可以调用对应的BIF。

Counter:计数器

用法如下:

from collections import *c  = Counter()for ch in 'this is a string':
    c[ch]+=1 #自动生成对应的键和值,值默认为0.每次出现则加1print(c)

结果是:Counter({'i': 3, 's': 3, ' ': 3, 't': 2, 'h': 1, 'a': 1, 'r': 1, 'n': 1, 'g': 1})

deque:队列

高效实现插入和删除操作的双向列表,适合用于队列和栈。如果数据量大而插入删除操作又多,可以使用deque。并且他继承了list的方法。

多出的两种常用方法:

  1. appendleft(obj):Add an element to the left side of the deque.

  2. popleft():Remove and return the rightmost element.

namedtuple

namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。这样一来,我们用namedtuple可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。

我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:p = (1,2)。但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。定义一个class又小题大做了,这时,namedtuple就派上了用场:

>>> from collections import namedtuple>>> Point = namedtuple('Point', ['x', 'y'])>>> p = Point(1, 2)>>> p.x1>>> p.y2>>> isinstance(p, Point)True>>> isinstance(p, tuple)True

defaultdict:key不存在时的dict

from collections import defaultdict
dd = defaultdict(lambda: 'N/A') #默认值是调用函数返回的,而函数在创建defaultdict对象时传入dd['key1'] = 'abc'print(dd['key1'])print(dd['不存在的'])

OrderedDict:留有顺序的字典

顺序是添加键值对的顺序,这样,在迭代的时候可以保持顺序。并且可以实现先入先出等类似的字典对象。

from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3)])print(d) # dict的Key是无序的od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])print(od) # OrderedDict的Key是有序的



      本文转自zsdnr  51CTO博客,原文链接:http://blog.51cto.com/12942149/1949808,如需转载请自行联系原作者






相关文章
|
6天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
22 1
|
2天前
|
机器学习/深度学习 人工智能 算法
机械视觉:原理、应用及Python代码示例
机械视觉:原理、应用及Python代码示例
|
2天前
|
安全 前端开发 JavaScript
在Python Web开发过程中:Web框架相关,如何在Web应用中防止CSRF攻击?
在Python Web开发中防范CSRF攻击的关键措施包括:验证HTTP Referer字段、使用CSRF token、自定义HTTP头验证、利用Web框架的防护机制(如Django的`{% csrf_token %}`)、Ajax请求时添加token、设置安全会话cookie及教育用户提高安全意识。定期进行安全审计和测试以应对新威胁。组合运用这些方法能有效提升应用安全性。
8 0
|
4天前
|
缓存 人工智能 API
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
8 0
|
6天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
12 1
Flask框架在Python面试中的应用与实战
|
7天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
使用Python构建简单的图像识别应用
本文将介绍如何利用Python语言及其相关库来构建一个简单但功能强大的图像识别应用。通过结合OpenCV和深度学习模型,我们将展示如何实现图像的特征提取和分类,从而实现对图像中物体的自动识别和分类。无需复杂的算法知识,只需一些基本的Python编程技巧,你也可以轻松地创建自己的图像识别应用。
|
10天前
|
数据挖掘 vr&ar Python
Python金融时间序列模型ARIMA 和GARCH 在股票市场预测应用
Python金融时间序列模型ARIMA 和GARCH 在股票市场预测应用
34 10
|
10天前
|
机器学习/深度学习 数据采集 供应链
从数据到决策:scikit-learn在业务分析中的应用
【4月更文挑战第17天】本文探讨了scikit-learn在业务分析中的应用,包括数据预处理、分类、回归和聚类模型的构建,以及模型评估与优化。通过使用scikit-learn,企业能有效处理数据、预测趋势、客户细分并制定决策,从而提升经营效率和市场策略。随着机器学习的发展,scikit-learn在业务分析领域的潜力将持续释放,创造更多价值。
|
10天前
|
机器学习/深度学习 算法
scikit-learn在回归问题中的应用与优化
【4月更文挑战第17天】本文探讨了scikit-learn在回归问题中的应用,介绍了线性回归、岭回归、SVR和决策树回归等算法,并提出优化策略,包括特征选择、超参数调优、交叉验证和集成学习。通过实践案例展示如何处理房价预测问题,强调了根据问题特点选择合适方法的重要性。
|
10天前
|
算法 Serverless 计算机视觉
SciPy的科学计算库的基础知识与应用
【4月更文挑战第17天】**SciPy**是Python的开源科学计算库,基于NumPy,包含优化、积分、线性代数、信号处理等模块。本文介绍了SciPy的基本使用,如线性代数(矩阵运算、特征值)、优化(最小化问题)、积分以及信号处理(滤波)。安装SciPy可使用`pip install scipy`。此外,还展示了图像处理和常微分方程求解的例子。SciPy是科学计算的重要工具,适用于各种数值问题。参考文献包括SciPy和NumPy官方文档。