python_way,day4 内置函数(callable,chr,随机验证码,ord),装饰器
python_way,day4
1、内置函数 - 下
制作一个随机验证码
2、装饰器
1、内置函数 - 下
- callable() #对象能否被调用
- chr() #10进制数字对应的ascii码表中的内容
- ord() #查询对应的ascii码表中的元素的位置
chr(65) A- ord(A) 65
- 使用random这个模块和chr()写一个生成验证码的功能。
- import random
- li = []
- def num():
- """
- 生成一个随机的元素,这个元素可能是大写字母,小写字母还有数字。
- :return: 随机的英文或者数字
- """
- b=random.randrange(0,5)
- #生成一个数字
- if b == 2 or b == 5: #这个随机的数字如果等于2 或者 5 的时候
- a = random.randrange(97,122) #a 等于 97 -- 122 之间的一个数字
- small = chr(a) # 这个数字在ascii码中对应的位置是小写字母的位置
- return small #返回出来
- elif b == 1 or b == 6:
- a = random.randrange(65,90)
- big = chr(a) #同理,这个范围是大写字母的范围
- return big
- else:
- a = random.randrange(1,10) #都不是则返回的是1-9的数字
- return str(a)
- def auth_num():
- l = []
- for i in range(6): #循环6次
- l.append(num()) #每次将上面生成的随机数插入到l这个 空列表中,6次后则生成了一个6位的随机数
- s = "".join(l) #将列表转成字符串
- return s
- a = auth_num()
- print(a)
- compile() #编译代码
python解释器读取python文件的过程:
读取文件内容 open() 转成str放到内存
- python如何能能知道这些str是什么语法?
- python内部把字符串 -----> 编译成python认识的特殊代码 ----> 执行代码
s = "print(123)"
r = compile(s,"<string>","exec") 用来编译代码
- 如果第二位不加 <string> 前面的s就要传一个文件
- print(r)
<code object <module> at 0x0000005A65327C00, file "<string>", line 1>
这个就是将s编译成为了python认识的代码
然后python再用exec()去执行这段代码
s 这个位置也可以是一个文件
5 exec()
- exec能执行python任意的代码
- exec可以直接接受一个没有被编译的字符串直接执行。也可以接收一个编译好的对象。
- exec(r)
123 # 就得到了 s 这个字符串 print 这个执行的结果了
#exec() 是能执行代码但是没有返回结果
- 6 eval()
- eval是只能执行一个表达式,但是他有返回结果
- a = eval("1+2+3")
print(a)
6
7 dir() #获得一个类提供了那些功能- 8 help() #查看帮助
- 9 divmode() #计算数字取余数和商数
a = divmod(100,7)
print(a)
获得一个元组(14,2)- 10 isinstence() #查看一个对象是否属于某个类
s = "123"
a = isinstance(s,str)
print(a)
True- 11 filter() & map()
首先先做一个需求
- li = [11,22,33,44,55]
- #写一个函数,只要大于33的元素
- def f1(arg):
- min_list = []
- for i in arg:
- if i > 22:
- min_list.append(i)
- return min_list
- a = f1(li)
- print(a)
- [33,44,55]
filter()就可以实现上面的功能
- fileter(函数,可迭代对象)
- li = [11,22,33,44,55]
ret = fileter(None,li)
print(list(ret)) #在python2中filter返回的模式是个list,python3中ret返回的是个对象,我们需要制定他的类型
[11,22,33,44,55]
- 由于第一个参数我们传递的是None,所以得到的结果就是传入的那个值
这是我们在None这里定义一个函数
def f1(arg):
if f1 > 22:return True
把这个函数放到 filter中
ret = filter(f2,li)
print(list(ret))
[33,44,55]
这样就能看出来:
filter是具有过滤功能的,他把第二个参数放到第一个参数中做匹配,如果是True则自定的加到ret中
这是我们就可以用lambda来写这个函数,更简便
ret = filter(lambda a:a>22,li)
print(list(ret))
[33, 44, 55]
原理:
在filter内部会循环第二个参数,然后每次循环的内部会执行第一个参数,把为真的结果的元素添加到filter的返回值中。
简单的说:函数返回True,将元素添加到结果中。
- map()
需求:
li = [11,22,33,44,55] 每个列表中的元素 + 100
def f1(arg):
l = []
for i in arg:
i = i + 100
l.append(i)
return l
- print(f1(li))
[111,122,133,144,155]
- map()就是来实现上面的功能的
map(函数,可迭代的对象)
li = [11,22,33,44,55]
ret = map(lambda:a+100,li)
print(list(ret))
[111, 122, 133, 144, 155]
原理:
map先遍历li列表中的内一个每元素,然后将这个元素放到前面的函数中去执行,并将执行结果返回出来。
简单的说:将函数的返回值添加到结果中
- 12 frozenset() #将一个对象编程不能变的集合。
- s = {11,22,33}
- ret = frozenset(s)
- print(ret)
- frozenset({33, 11, 22})
- t = (11,11,22,33)
ret = frozenset(t)
print(ret)
frozenset({33, 11, 22})
- 13globals() & locals()
- globals() 代表着所有的全局变量
- locals()代表着所有的局部变量
- def f1():
a = 123
print(globals())
print(locals())- 这样就会找出所有的全局变量和局部变量。
全局变量中包括:自定义的全局变量和内置的全局变量
2、装饰器:
- def outer(func):
- def inner():
- print("log")
- return func()
- return inner
- @outer
def f1()
print("F1")
装饰器原理1:
- def f1():
- print(123)
- def f1():
- print(456)
- f1()
- 当执行f1的时候我们得到的结果是 456
- 因为函数执行有先后顺序,最后一次执行的456把之前执行的123覆盖了。
装饰器原理2
- def f1():
- print(123)
- def f2(arg):
- arg()
- f2(f1)
- 结果是把f1当做整体传给了f2,f2的内部则是对这个传入的对象进行调用
- 结果就是执行了f1()
先说说装饰器的功能:
1、自动执行outer函数:相当于@outer是 自动执行outer()
2、将下面的函数名f1当做参数传递给outer(f1)
3、将outer函数的返回值重新赋值给f1
- 此时如果outer()内部是这样的
- def outer(func)
- pirnt(123,func)
return “111”- @outer
- def f1():
- print(123)
- 结果就是
- 123, <function f1 at 0x00000345332>
执行outer,f1函数对象被当成参数传给了func这个形参- 所以就证明了上面的1、2结论
- 第三结论就是
当执行@outer的时候,就会把outer()返回值重新赋值给f1
就相当于 f1=“111”- 所以此时即便上面我们定义了f1的函数,但是又相当于给f1重新赋值了111,所以上面定义的就没有效果了。
- 在用装饰器之前 f1对象内存为
<function f1 at 0x000000CE29CEF158>
执行装饰器后f1的地址则发生了改变,就证明了第3个功能
<function f1 at 0x00000014EDB80268>
上面我们的outer 返回值时111,那么我们也可以给他返回一个函数:
- def outer(func)
- def inner()
- print('before')
- return inner
- @outer
def f1():
print('F1')
- def f1():
- print("")
- def f2():
- print(666)
- f1=f2
- print(f1())
666 (print内容)
None (由于f2没有指定return,所以返回值为None)
一个函数体f2赋值给另一个函数体f1,执行后就相当于赋值后的函数体f2:
但是此时我们只是简单的把inner的功能赋值给了f1,我们是要把f1的功能保留并且新增加一个inner中的功能
那么我们应该怎么办??
我们只要把返回给f1的inner中加一条引用刚刚传进outer时的f1,就可以把f1功能加进来了。
- def outer(func):
- def inner():
- print("before")
- func()
- return inner
# func就是刚刚传入的f1
#此时我们发现我们成功的将f1函数改变了。但是我们的初衷是不改变原函数,并对其效果增加功def outer(func)
- def outer(func):
def inner(arg):
print("before")
r = func(arg) #(arg) 就是原函数f1传过去的值
print("after")
return f
return inner
@outer
def f1(arg):
print(arg)
return arg- f1('F1')
- before
F1
after
python_way,day4 内置函数(callable,chr,随机验证码,ord),装饰器的更多相关文章
- python day5 lambda,内置函数,文件操作,冒泡排序以及装饰器
目录 python day 5 1. 匿名函数lambda 2. python的内置函数 3. python文件操作 4. 递归函数 5. 冒泡排序 6. 装饰器 python day 5 2019/ ...
- Day4 内置函数补充、装饰器
li = [11,22,33,44]def f1(arg): arg.append(55)#函数默认返回值None,函数参数传递的是引用li = f1(li) print(li) 内置函数补充: ...
- day4 内置函数 迭代器&生成器 yield总结 三元运算 闭包
内置函数: 内置函数 # abs()返回一个数字的绝对值.如果给出复数,返回值就是该复数的模. b = -100 print(b) print(abs(b)) # all() 所有为真才为真,只要有一 ...
- python-内置函数-callable,chr,ord,bytes,随机验证码生成
s="老男人" bytes(s,encoding="utf-8") 随机验证码的实现方法: 大写字母: li = [] for i in range(6): t ...
- Python内置函数(17)——chr
英文文档: chr(i) Return the string representing a character whose Unicode code point is the integer i. F ...
- Python内置函数(10)——chr
英文文档: chr(i) Return the string representing a character whose Unicode code point is the integer i. F ...
- 内置函数callable(object)
如果对象object参数是可以调用的对象,就返回True:否则返回False.不过要注意的是,当一个对象是可以调用的,并不表示调用该对象时执行一定成功,但不可调用的对象去调用时一定不会成功.如果类对象 ...
- Python标准库:内置函数callable(object)
假设对象object參数是能够调用的对象,就返回True.否则返回False.只是要注意的是,当一个对象是能够调用的.并不表示调用该对象时运行一定成功,但不可调用的对象去调用时一定不会成功.假设类对象 ...
- Python内置函数之chr()
参数是一个整型对象: chr(integer) 返回整型对应的Unicode字符对象. 例子: >>> chr() '\x0c' >>> chr() 'ⲓ' > ...
随机推荐
- django中request对象详解(转载)
django中的request对象详解 Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将 HttpRequest对象 作为第一个参数传入该函数. ...
- JS 动态加载脚本 执行回调_转
关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解 ...
- Getting Started with the C# Driver
1.下载 如果下载的.zip文件,只需要解压即可. 如果安装的.msi文件,它会将C#驱动DLL放在C:\Program Files (x86)\MongoDB\CSharp Driver xxx的位 ...
- webconfig简单加密解密
<?xml version="1.0"?><configuration> <configSections> <section name=& ...
- redis初试牛刀
先来无事就学学redis.可是并没有想的那么美好.首先要解释一下,redis主流是安装在lunx系统中的,甚至官网直接没有给出windows版本.要下载windows只能去所谓的githup.好吧我在 ...
- JAVA基础知识之IO——IO流(Stream)的概念
Java IO 流 Java将不同的设备或载体(键盘.文件.网络.管道等)的输入输出数据统称为"流"(Stream),即JAVA的IO都是基于流的. JAVA传统的所有流类型类都包 ...
- Uva 1220,Hali-Bula 的晚会
题目链接:https://uva.onlinejudge.org/external/12/1220.pdf 题意: 公司n个人,形成一个数状结构,选出最大独立集,并且看是否是唯一解. 分析: d(i) ...
- uva 437,巴比伦塔
题目链接:https://uva.onlinejudge.org/external/4/437.pdf 题意:巴比伦塔: 给出n种立方体,一个立方体能放到另一个立方体上,必须满足,底面一定要小于下面的 ...
- 系统调优之numa架构
NUMA简介 在传统的对称多处理器(SMP, Symmetric Multiprocessing)系统中,整个计算机中的所有cpu共享一个单独的内存控制器.当所有的cpu同时访问内存时,这个内存控制器 ...
- mvcAPI (入门 3)
续上 1)无参数Get请求 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> < ...