自学python

                              好久没更新了,这次来波大的

1.装饰器

装饰器:
定义; 本质是函数,(装饰其他函数)就是为其他函数添加附加功能
原则: 1.不能修改被装饰的函数的源代码
        2.不能修改被装饰的函数的调用方式

实现装饰器知识储备:
1.函数即“变量”
2.高阶函数

    a.把一个函数名当做实参传给另外一个函数
    (在不修改被装饰函数源代码的情况下为其添加功能)
    b.返回值中包含函数名
    (不修改函数的调用方式)
3.嵌套函数

高阶函数+嵌套函数 = 装饰器

 

 

 
import time
def timmer(func):
    def warpper(*args,**kwargs):
        start_time = time.time()
        func()
        stop_time = time.time()
        print("the func run time is %s"%(stop_time-start_time))
    return warpper


@timmer
def test1():
    time.sleep(3)
    print("in the test1")

 

def bar():
    print("in the bar")

def foo():
    print("in the foo")
    bar()
foo()

 

import time

def  bar():
    time.sleep(2)
    print("in the bar")

def test1(func):
    start_time = time.time()
    func()  #运行bar
    stop_time = time.time()
    print("the func run time is %s"%(stop_time-start_time))
test1(bar)

def test2(func):
    print(func)
    return func
bar = test2(bar)
bar()

 

import time
def timer(func):
    def deco():
        start_time = time.time()
        func()
        stop_time = time.time()
        print("%s"%(stop_time-start_time))
    return deco

@timer  #test1 = timer(test1)
def test1():
    time.sleep(1)
    print('adadada')

@timer   #test2 = timer(test2)
def test2():
    time.sleep(1)
    print("asdasdasdfgsd")


test2()
test1()


2.局部变量

 
 
school = "oldboy edu"
names = ["alex","jack","rain"]
def stable_name():
    names[0] = "但敬爱死了的骄傲"
    print("inside func",names)
stable_name()#局部变量在修改全局变量的时候除了字符串和整数以外,其他的都可以改
print(names)

def change_name(name):
    global school#声明school为全局变量,可以进行修改全局变量
    print("before change ",name)
    name = "alex li"#局部变量只在函数里起作用,这个函数就是这个变量的作用域
    print("after change",name)

name = 'alex'
change_name(name)
print(name)


3.递归

# def calc(n):
#     print(n)
#     return calc(n+1)
#
# calc(0)


def cac(n):
    print(n)
    if int(n/2) > 0:
        return cac(int(n/2))
    print("->",n)
cac(10)



'''
递归特性:
1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈这种数据结构实现的,
每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是
无限的,所以,递归调用的次数过多,会导致栈溢出)

'''


4.高阶函数

def add(a,b,f):
    return f(a)+f(b)

res = add(3,-7,abs)
print(res)

5.yield伪并发

import time
def consumer(name):
    print("%s 准备吃包子啦"%name)
    while True:
        baozi = yield
        print("包子[%s]来了,被[%s]吃了"%(baozi,name))

def producer(name):
    c = consumer('a')
    c2 = consumer('b')
    c.__next__()
    c2.__next__()
    print("老子开始做包子啦")
    for i in range(10):
        time.sleep(1)
        print("做了两个包子")
        c.send(i)
        c2.send(i)


producer("alex")

6.时间模块

import time
# print(time.time())#显示时间戳
# print(time.clock())#cpu执行时间
# print(time.gmtime())#这是国际第一时区的时间UTC世界标准时间
# print(time.localtime())#本地时间
# struct_time = time.localtime()
# print(time.strftime('%Y--%m--%d  %H:%M:%S',struct_time))#字符串时间
# print(time.strptime('2017-08-23 18:23:12','%Y-%m-%d %H:%M:%S'))#结构化时间
# a = time.strptime('2017-08-23 18:26:12','%Y-%m-%d %H:%M:%S')
# print(a.tm_mday)

print(time.ctime(3600))
print(time.mktime(time.localtime()))#把时间转化成时间戳


import datetime
print(datetime.datetime.now())

7.生成器


# 生成器一共两种创建方式:
# 1.  (x*2 for x in range(5))
#2.yield

def foo():
    print('sdfsdfasd')
    yield 1
    print("asdffhnukhjksqw")
    yield 2

g = foo()
next(g)
next(g)

#
# for i in foo():
#     print(i)
#
#
#
# def fib(max):
#     n,before,after = 0,0,1
#     while n<max:
#         print(after)
#         before,after=after,before+after
#         n = n+1
# fib(10)#3min

8.迭代器

#生成器都是迭代器,迭代器不一定是生成器
#list,tuple,dict,string:iterable(可迭代对象)

l=[1,2,3,5]
d = iter(l)
print(d)

# 什么是迭代器?
# # 满足两个条件:1.有iter方法  2.有next方法

print(next(d))
print(next(d))
print(next(d))
print(next(d))

9.迭代器生成器回顾

列表生成式
[x*2 for x in range(10)]

生成器(generator object)
    创建生成器两种方式:
        1.  (x*2 for x in range(10))>>>>>>>>generator object
        2.  def f():
                yield 2

                f()>>>>>>generator object

    生成器的方法:
        1.  next(f())---------计算出一个值
            注意:生成器在创建的时候已经决定了能计算出值的个数,调用next的次数超过这个值
         就会报StopIteration
         遍历所有元素可以通过for循环:
                    for i in [1,2,3]
                        print i
             for循环内部做了三件事:
                    1.调用对象的iter()方法,返回一个迭代器对象
                    2.while:
                            try:
                                i = next(list_Iterator)

                            except StopIteration:
                                break
        2.send():
            f().send(None)#等价于next(f())



#迭代器

    满足迭代器协议:
            1.内部有next方法
            2.内部有iter()方法



time模块:
    time.time()
    time.strftime()
    time.gmtime():utc时间
    time.localtime()
    time.ctime():

datetime
    datetime.datetime.now()


random
    char():随机转化成字母和数字(验证码)

10.随机数

import random
# print(random.random())# 0-1随机数
# print(random.randint(1,8))# 1-8随机数包括8
# print(random.choice('hello'))
# print(random.choice(['123',4,[1,2,3]]))
# print(random.sample(['123',4,[1,2,3]],2))#随机选两个数
# print(random.randrange(1,3))#不包括3


def v_code():
    code = ''
    for i in range(6):
        add = random.choice([random.randrange(10),chr(random.randrange(65,91))])
    # code = ''
    # for i in range(5):
    #     if random.choice():
    #         add = random.randrange(10)
    #
    #     else:
    #         add = chr(random.randrange(65,91))
        code+=str(add)
    print(code)

v_code()#生成6位数随机验证码

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值