Python学习之旅 —— 基础篇(四)内置函数、装饰器

本篇要点:
内置函数
装饰器
 
一、内置函数
 
# abs() :取绝对值
>>> res = abs(-10)
>>> print(res)
10
# 0,None,"",{},[],() 布尔值都为空
# all(),any() 判断值的真假
# all() 所有为真才为真
p = all([0,1,2,3]) # 0为False,所有p 是False
print(p)
# any() 任意一个为真即为真
p = any((0,"",[],1))
print(p)
# 进制转换
# bin() 十进制转换成二进制
>>> a = 10
>>> print(bin(a))
0b1010
# int() 十进制转换成十进制
>>> a = 10
>>> print(int(a))
10
# oct() 十进制转换成八进制
>>> a = 10
>>> print(oct(a))
0o12
# hex() 十进制转换成十六进制
>>> a = 18
>>> print(hex(a))
0x12
# bool()真假值判断
>>> a = 0 
>>> bool(a)
False
>>> a = 1
>>> bool(a)
True 
 
# float() 浮点数
# round(float, digits)接受一个浮点数 flt 并对其四舍五入,ndig位小数。
ret = 10 / 3
ret = float(ret)
ret = round(ret, 2) #保留两位小数
print(ret)
 
3.33
# [重要] 字符串转换成字节,用bytes()
name = "谢鹏程"
n = bytes(name, encoding="utf-8")
print(n)
n = bytes(name, encoding="gbk")
print(n)
 
# 查询数字对应的ASCII码表内的值
>>> a = chr(65)
>>> print(a)
A

# 查询字符对应的ASCII码表的位置
>>> a = ord("A")
>>> print(a)
65
 
可以用来生成随机字符串(随机密码),示例:
# 随机字符串生成
import random
li = []
for i in range(16):
    # 33 <= i < 127
    temp = random.randrange(33, 127)
    c = chr(temp)
    li.append(c)

res = "".join(li)
print(res)

# 随机大写字母和数字
li = []
for i in range(16):
    r = random.randrange(0, 3)
    if r == 1 or r == 2:
        temp = random.randrange(0, 10)
        li.append(str(temp))
    else:
        # 33 <= i < 127
        temp = random.randrange(65, 91)
        c = chr(temp)
        li.append(c)

res = "".join(li)
print(res)
View Code
 
# dir() 快速查看一个对象提供了哪些功能
res = dir(dict)
print(res)

#help()详细功能展示
res = help(dict)
print(res)
# [重要] divmod()  做除法,用元组的形式返回商和余数;
>>> a = 10
>>> b = 3
>>> divmod(a, b)
(3, 1)
可用于内容的分页展示:(共97条记录,每页展示10条,共需要多少页),示例:
total = 97
per = 10
temp_tuple = divmod(total, per)
if temp_tuple[1] == 0:
    ret = temp_tuple[0]
else:
    ret = temp_tuple[0] + 1
print(ret)
 
# enumerate(迭代器) 枚举,用列表的形式返回索引和值
a = [11,22,33,44,[1,2,3,4,]]
ret = enumerate(a)
print(list(ret))
[(0, 11), (1, 22), (2, 33), (3, 44), (4, [1, 2, 3, 4])]
#或者
a = [11,22,33,44,[1,2,3,4,]]
for index, value in enumerate(a):
    print(index, value)
0
11 1 22 2 33 3 44 4 [1, 2, 3, 4]

 

# eval 只执行表达式,并获取结果,有返回值
s = "1+2*3"
res = eval(s)
print(res)
7
 
# 将字符串编译成python代码
#compile()
string = "print(123)"
a = compile(string, "<string>", "exec")
print(type(a))
 
<class 'code'>
 
# 执行python代码,接收代码或者字符串,字符串时先编译成代码再执行,默认包含compile()
#exec() # 没有返回值
string = "print(123)"
exec(string)
print(exec(string)) # 没有返回值,默认是None
 
123
None
 

 

# [重要]  #filter(def, 可迭代对象) 做筛选; # map(def, 可迭代对象) 做操作.
li = [1,2,3,4,5,6,7,8,9,10,1,2,3]
# def f1(args):
#     if args > 6:
#         return True
# ret = filter(f1, li) #返回的是一个列表
ret = filter(lambda a: a > 6, li)
print(list(ret))

#map()
li = [1,2,3,4,5,6,7,8,9,10,1,2,3]
ret = map(lambda a: a + 100, li)
print(list(ret))

 

# id() 获取对象的内存地址
a = [1,2,3,4,]
print(id(a))
4315410184
# [重要]判断对象是否是某个类的实例,返回True or False
s = "xie"
res = isinstance(s, str) # 判断变量s是否为字符串
print(res)
 
True
 
# len() 返回长度
a = "Pesen"
print(len(a))

5

 

# globals() 返回当前范围的全局变量,字典形式;locals() 返回当前范围所有的局部变量
NAME = "Pesen"
def f1():
    sec_name = "Xie"
    print(locals())
    print(globals())
f1()
 
{'sec_name': 'Xie'}
{'__builtins__': <module 'builtins' (built-in)>, '__name__': '__main__', '__package__': None, 'f1': <function f1 at 0x10127b8c8>, '__spec__': None, '__file__': '/Users/xiepengcheng/PycharmProjects/LearnPython/day4/temp.py', '__cached__': None, 'NAME': 'Pesen', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x1010a5c88>, '__doc__': None}
# min() 、max()、sun()取最小值,最大值,求和
li = [1,2,3,4,5,6,7,3,1,5]
print(min(li), max(li), sum(li))
 
1 7 37
# pow(x, y, z) 两个参数是计算x的y次方;三个参数是计算 x**y % z
a = pow(2, 4)
print(a)
 
16
 
a = pow(2, 4, 2)
print(a)
 
0
# zip() 接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
xyz = zip(x, y, z)
print(list(xyz))
 
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
 
# python3.5  按照字符来遍历
>>> for i in "谢鹏程":
...   print(i)
 
谢
鹏
程
 
# python2.7 #按照字节
>>> a = "谢鹏程"
>>> print a[:3], a[3:6], a[6:9]
谢 鹏 程
 

 

二、装饰器
在不改变原有函数功能的基础上,执行函数前后增加某项功能。
开放封闭原则:软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。
1、装饰器的功能说明
    通过一个例子来解释:
def outer(func):
    def inner():
        print("log")
        return func()
    return inner
 
 
@outer
def f1():
    print("F1")
想给哪个函数增加装饰器就在函数定义上一行写上@[装饰器函数名称],例如:@outer
功能:
  • a. 调用执行f1函数时,自动执行outer函数,并且将函数名f1当做参数传递给outer;
  • b. 将outer函数的返回值,实例中为函数名inner,重新赋值给f1。
 
所以可以看出,调用f1函数时,实际执行的是outer函数内定义的inner函数。
而函数名f1当错参数传递给了outer,所以执行func()就等于执行了原f1()。
所以这个程序实现的功能是:在打印F1字符串之前,先打印log字符串。
 
2、装饰器练习示例:使用后台功能时,先进行登录验证,如果未登录,提示登录。
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author:Pengcheng Xie


LOGIN_INFO = {"is_login": False, "current_user": "", }


def outer(func):
    def inner():
        if LOGIN_INFO["is_login"]:
            username = LOGIN_INFO["is_login"]
            print("%s用户你好,欢迎登录." % username)
            func()
        else:
            print("未登录,请先登录")
    return inner


@outer
def order():
    print("订单管理")


@outer
def changepwd():
    print("修改密码")


@outer
def manager():
    print("功能列表:\n1.订单管理  2.修改密码")
    inp = input("请输入选项: ")
    if inp == "1":
        order()
    elif inp == "2":
        changepwd()


def login():
    user = input("用户名: ")
    pwd = input("密码: ")
    if user.strip() == "Pesen" and pwd.strip() == "123":
        LOGIN_INFO["is_login"] = True
        LOGIN_INFO["current_user"] = "Pesen"
        print("欢迎登录")
        manager()


def main():
    while True:
        inp = input("1.登录  2.后台管理\n请输入选项: ")
        if inp == "1":
            login()
        elif inp == "2":
            manager()
        else:
            print("输入有误,请重新输入!")


main()
View Code

3、多层装饰器的使用

def check_login(func):
    def _check_login(*args, **kwargs):
        func(*args, **kwargs)
    return _check_login


def check_admin(func):
    def _check_admin(*args, **kwargs):
        func(*args, **kwargs)

    return _check_admin


# 顺序执行,先执行check_login, 再执行 check_admin
@check_login
@check_admin
def manage():
    print("manage")

manage()

 

 

 

转载于:https://www.cnblogs.com/pesen/p/5544389.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值