首页 > 技术文章 > Python 进阶系列(一)

studyontheway 2017-07-28 20:38 原文

Python 常见用法(一)

  • 一:列表推导

顾名思义就是通过一个列表推导出另外一个

#-*- coding:utf-8 -*-
import time
__author__ = 'Administrator'
#"常用列表赋值"
number = range(100000000)
evens = []
i = 0;
begin = time.time()
while i < len(number):
    if i % 2 == 0:
        evens.append(i)
    i = i + 1;
end = time.time()
print("耗时为",end-begin)
#"推导公式赋值"
begin = time.time()
evens = [i for i in range(100000000) if i % 2 ==0]
end = time.time()
print("耗时为",end-begin)

#"结果分别为: 耗时为 35.95461106300354"
#"            耗时为 13.877903461456299"

#还有一种常见的情况 enumerate内建函数函数
i = 0
seq = ["one","two","three","four"]
for element in seq:
    seq[i] = '%d:%s' %(i,seq[i])
seq = ["one","two","three","four"]
for i,element in enumerate(seq):
    seq[i] = '%d:%s' %(i,seq[i])

第一种在其他语言中使用这样赋值会比较常见,但是Python使用这种赋值语句执行速度会比较慢,因为通过这种方式解释程序必须通过一个计数器跟踪列处理列表的修改,第二种效率更高同时更加简练涉及到的变量更少,缺陷自然减少。

  • 二: 迭代器

    1 . 通过 iter() 內建函数构建

    2 . __next__() 函数取值(python2 使用的是 next()函数)

line = "helloworld"
itertable = iter(line)
num = 0;
while True:
    try:
        #num = num+1;           放这里num输出 11
        print(itertable.__next__())
        num = num+1;            #这里num输出 10
    except StopIteration:
        break
print(num)

itertool 是一个用C语言写的迭代器模块,据说是最高效的迭代器。


def function():
    a,b = 0,1
    while b < 100:
        yield b
        a,b = b,a+b
fib = function()

  • 三: 生成器

    1 . 基于 yield 返回的也是一个迭代器 (个人理解yield相当于一个列表缓冲区暂存数据,处理完之后返回结果) 常用在 将返回一个序列作为循环时
def function():
    a,b = 0,1
    while b < 100:
        yield b
        a,b = b,a+b
fib = function()
while True:
    try:
        print(fib.__next__())
        num = num+1;
    except StopIteration:
        break
[print(function.)]
print(num)

iter = (x**2 for x in range(10) if x % 2 ==0 )
# "这种方式生成的也是一个迭代器"

  • 四:装饰器

  1. 装饰函数

装饰器使得函数和方法的封装(接收一个函数返回另一个功能强大的函数)

def mydecorator(args):  #装饰器函数的参数  可以不要
    def mydecorator(func):  #装饰器自身实现 必须要的
        def _mydecorator(*arg,**kwargs):  ##处理参数,相当于再嵌套一层参数传递的函数 这是固定结构
            def wrapper():      #包装器
                ## 在调用时实际数是做一些填充工作 常常用来检测一个函数的执行时间
                print(func.__name__+"  函数 begin 时间为:" +  str(time.time())+"mydecorator 的参数  " + args)
                func(*arg,**kwargs)
                print(func.__name__+"  函数end 时间为: " + str(time.time()) +"mydecorator 的参数  " + args)
                return func
            wrapper()
        return _mydecorator
    return  mydecorator
@mydecorator("mycanshu")    ## 这是一种比较实用的方式不改变函数的内在结构把功能加上去 等价于 myfun = mydecorator(myfun) 其中 mycanshu 是装饰器的参数
def myfunc(x,y):
    time.sleep(3)
    print(1+2+x+y)

myfunc(3,4)

输出
# "myfunc  函数 begin 时间为:1501228594.8052733mydecorator 的参数  mycanshu"
# "10"
# "myfunc  函数end 时间为: 1501228597.8063107mydecorator 的参数  mycanshu"

  1. 装饰类
    类装饰和函数装饰类似
class test_deco:
    def __init__(self):
        print("调用构造函数")
    @staticmethod   ##静态方法
    def show_function():
        print("这是静态的请求方法")
    @staticmethod
    def out__function():
        print("这是静态的解锁方法")

def mydecorator(cls,myfun_arg):
    print(cls.__name__,myfun_arg)    #这里输出的是test_deco myfun_arg
    def __mydecorator(func):
        print(func.__name__) #这里输出的是myfun
        def __mydecorator(*arg,**kwargs):
            print(arg)  这里输出的时(1,2)
            def wrapper():
                print("这里")
                print(func.__name__+"  函数 begin 时间为:" + str(time.time())+"   mydecorator 的参数 " + myfun_arg )
                cls.show_function()
                func(*arg,**kwargs)
                cls.show_function()
                print(func.__name__+"  函数end 时间为: " + str(time.time()) +"mydecorator 的参数  " + myfun_arg)
            wrapper()
                        #分别输出
            '''
            这里
            myfun  函数 begin 时间为:1501230826.2434075   mydecorator 的参数 myfun_arg
            这是静态的请求方法
            myfun() show 2
            这是静态的请求方法
            myfun  函数end 时间为: 1501230829.2444615mydecorator 的参数  myfun_arg
            '''
        return __mydecorator
    return __mydecorator
@mydecorator(test_deco,"myfun_arg")


def myfun(x,y):
    time.sleep(3)
    print("myfun() show",x*y)

myfun(1,2)

推荐阅读