【python-Day4(内置函数补充、装饰器)】

一、内置函数补充

1. python内置函数表

 

2. ASCII码表

# chr # ASCII码表  查询十进制对应的字符
ret = chr(65)
print(ret)
==> A

# ord # ASCII码表  查询字符对应的十进制
ret = ord('A')
print(ret)
==> 65

# 产生随机字母
for i in range(10):
    temp = random.randrange(65,91) # ascii码中,65-90是代表A-Z
    aa = chr(temp)
    li.append(aa)
print(li)
==> ['N', 'V', 'P', 'A', 'D', 'B', 'K', 'O', 'M', 'Q']

# 产生随机验证码
for i in range(10):
    r = random.randrange(0,5)
    if r == 2 or r == 4:
        num = random.randrange(0,10)  # 随机产生0-9数字
        li.append(str(num))
    else:
        temp = random.randrange(65,91) # ascii码中,65-90是代表A-Z
        aa = chr(temp)
        li.append(aa)
print(li)
==> ['2', '5', 'K', 'D', '3', 'O', '3', '1', 'T', '8']

# 产生随机验证码
for i in range(10):
    r = random.randrange(0,5)
    if r == 2 or r == 4:
        num = random.randrange(0,10)  # 随机产生0-9数字
        li.append(str(num))
    else:
        temp = random.randrange(65,91) # ascii码中,65-90是代表A-Z
        aa = chr(temp)
        li.append(aa)
# print(li)
result = "".join(li) # 将元素拼接,元素中都必须为字符串
print(result)
==> 33SLATUZDE

# eval()      执行python代码,只执行表达式并获取结果,有返回值!
ret = eval("8*8")
print(ret) # 有返回值
==> 64

# exec()      执行python代码,接收代码或者字符串比eval更牛逼,只执行但是没有返回值!
aa = exec("8+8")
print(aa) # 没有返回值
==> None

# 快速查看对象提供了哪些功能
print(dir(dict))

# 提供对象的详细功能,其实就是读源码
help(list) 

# 97条数据,每页显示10条,需要多少页(也就是分页)
r = divmod(99,10) # 得到商,得到余数
print(r)
print(r[0])
print(r[1])
==> (9, 9)
==> 9
==> 9

# isinstance()  判断对象是否是某个类的实例
s = "hexu"
r1 = isinstance(s,str)
r2 = isinstance(s,list)
r3 = isinstance(s,dict)
print(r1,r2,r3)
==> True False False

s1 = [11,22,33]
s2 = {"name":"hexu"}
r4 = isinstance(s1,list)
r5 = isinstance(s2,dict)
print(r4,r5)
==> True True

# filter 可迭代的对象(可以for循环的东西)
# 函数返回True,将元素添加到结果中
li = [11,22,33,44,55]

def f1(a):
    if a > 22:
        return True
# 循环li中的元素,如果满足f1中的条件,返回True,表示元素合法,然后就放到ret中
ret = filter(f1,li)
print(list(ret)) # 因为ret是元素,所以要加list()
==> [33, 44, 55]

# 用lambda快速实现实现
li = [11,22,33,44,55]
ret = filter(lambda a: a > 33,li) # 定义元素a
print(list(ret))
==> [44, 55]

# map  可迭代的对象(可以for循环的东西)
# 将函数返回值添加到结果中 ,所以跟filter还是有区别的
li = [11,22,33,44,55]

def f2(a):
    return a + 100

result = map(f2,li)
print(list(result))
==> [111, 122, 133, 144, 155]

# 用lambda快速实现
li = [11,22,33,44,55]
result = map(lambda a: a + 100,li)
print(list(result))
==> [111, 122, 133, 144, 155]

总结:利用filter、map可以做一些批量处理,让代码更简洁

# globals() 全局变量,返回当前范围的全局变量,返回的是字典形式
# locals()  局部变量,返回的是字典形式
NAME = "xuelu"
def f1():
    sec_name = "Li"
    print(locals())
    print(globals())
f1()
==> {'sec_name': 'Li'}
==> {'__doc__': None, '__cached__': None, 'NAME': 'xuelu', '__builtins__': <module 'builtins' (built-in)>, 'f1': <function f1 at 0x000000000069BC80>, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000634C50>, '__spec__': None, '__name__': '__main__', '__file__': 'E:/project/day4/内置函数2.py', '__package__': None}

# hash() 将对象转换成hash值,作为字典的key来储存到内存中
s = "hexu"
print(hash(s))
==> 4720577176872117953

# len()
# py3按字符计算,也可以按字节计算,转化一下就可以了
# py2按字节计算,只能按字节计算
s = "贺旭"
print(len(s))
==> 2

s = '贺旭'
b = bytes(s,encoding='utf-8')  # py3,换算成字节计算
print(len(b))
==> 6

# max() min() sum()
s1 = ([11,22,33,100])
print(max(s1))  #最大
print(min(s1))   #最小
print(sum(s1))  #求和
==> 100
==> 11
==> 166

# pow()
r =pow(2,4)# 2的4次方,想当于2**4
print(r)
==> 16

# 三个参数是计算 2**4 % 2      % --> 取模
r = pow(2, 4, 2) 
print(r)
==> 0

# round() 四舍五入
print(round(1.6))
print(round(1.4))
==> 2
==> 1

# zip() 接受任意多个(包括0个和1个)序列作为参数,返回的是元组
l1 = ["Hexu",11,22]
l2 = ["is",11,22]
l3 = ["god",11,22]

r = zip(l1,l2,l3)
temp = list(r)[0]
print(temp)
==> ('Hexu', 'is', 'god')

ret = ' '.join(temp)
print(ret)
==> Hexu is god

二、装饰器

装饰器也是函数,是为了不改变原函数的情况下,定义了一层函数,原函数引用这一层函数。使用装饰器可以在函数执行前和执行后添加相应操作。

装饰器也可以装饰类。

文件:s1.py

# 定义了一个outer函数,也就是装饰器
def outer(func):
    def inner(*args,**kwargs):  # 支持多参数调用,万能参数
        print("before")
        r = func(*args,**kwargs) # 获取原函数返回值,注意:调用的时候如果想显示原函数返回值,要print一下--> print(s1.f1("原函数要传参"))
        print("after")
        return r
    return inner # 不加()代指函数体

# 将下面的函数名f1、f2当做参数传递
# 调用执行f1函数时,自动执行outer函数,并且将函数名f1当做参数传递给outer
# 将outer函数的返回值,实例中为函数名inner,重新赋值给f1
@outer def f1(arg): print(arg) return "我是原函数f1返回值" def f2(name,age): print(name,age) return "我是原函数f2返回值"

文件:b1.py

import  s1

p1 = s1.f1("原函数f1要传参")
print(p1)

print("#############################")

p2 = s1.f2("传参1","传参2")
print(p2)

执行b1.py,输出如下:

before
原函数f1要传参
after
我是原函数f1返回值
#############################
传参1 传参2
我是原函数f2返回值

 三、多层装饰器

USER_INFO = {}
USER_INFO['is_login'] = True
USER_INFO['user_type'] = 2

def check_login(func):
    def inner(*args,**kwargs):
        if USER_INFO.get('is_login',None):  # (1)
            ret = func(*args,**kwargs)  # 引用的是check_admin函数下的innner (2)
            return ret  # (7)
        else:
            print("请登录")
    return inner

def check_admin(func):
    def inner(*args,**kwargs):
        if USER_INFO.get('user_type',None) == 2:   #(3)
            ret = func(*args,**kwargs)  # 引用的是index原函数  (4)
            return ret  #(6)
        else:
            print("您不是管理员,无权限查看")
    return inner


# 从上到下调用,从下到上编译
@check_login
@check_admin
def index():  # (5)
    '''
    管理员功能
    :return:
    '''
    print("管理员功能")
index()
View Code

 

posted @ 2016-06-03 14:53  旭势待发  阅读(127)  评论(0编辑  收藏  举报