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),装饰器的更多相关文章

  1. python day5 lambda,内置函数,文件操作,冒泡排序以及装饰器

    目录 python day 5 1. 匿名函数lambda 2. python的内置函数 3. python文件操作 4. 递归函数 5. 冒泡排序 6. 装饰器 python day 5 2019/ ...

  2. Day4 内置函数补充、装饰器

    li = [11,22,33,44]def f1(arg): arg.append(55)#函数默认返回值None,函数参数传递的是引用li = f1(li) print(li)   内置函数补充: ...

  3. day4 内置函数 迭代器&生成器 yield总结 三元运算 闭包

    内置函数: 内置函数 # abs()返回一个数字的绝对值.如果给出复数,返回值就是该复数的模. b = -100 print(b) print(abs(b)) # all() 所有为真才为真,只要有一 ...

  4. python-内置函数-callable,chr,ord,bytes,随机验证码生成

    s="老男人" bytes(s,encoding="utf-8") 随机验证码的实现方法: 大写字母: li = [] for i in range(6): t ...

  5. Python内置函数(17)——chr

    英文文档: chr(i) Return the string representing a character whose Unicode code point is the integer i. F ...

  6. Python内置函数(10)——chr

    英文文档: chr(i) Return the string representing a character whose Unicode code point is the integer i. F ...

  7. 内置函数callable(object)

    如果对象object参数是可以调用的对象,就返回True:否则返回False.不过要注意的是,当一个对象是可以调用的,并不表示调用该对象时执行一定成功,但不可调用的对象去调用时一定不会成功.如果类对象 ...

  8. Python标准库:内置函数callable(object)

    假设对象object參数是能够调用的对象,就返回True.否则返回False.只是要注意的是,当一个对象是能够调用的.并不表示调用该对象时运行一定成功,但不可调用的对象去调用时一定不会成功.假设类对象 ...

  9. Python内置函数之chr()

    参数是一个整型对象: chr(integer) 返回整型对应的Unicode字符对象. 例子: >>> chr() '\x0c' >>> chr() 'ⲓ' > ...

随机推荐

  1. linux主机vps简单性能测试

    第一,CPU.内存.硬盘检测 cat /proc/cpuinfo (查看CPU信息) cat /proc/meminfo (查看内存信息) df -lh (查看硬盘信息) 这个命令可以看到我们购买的V ...

  2. 忘记 oracle11g 的 sys 密码的处理

    方法1: 利用oracle 的本地用户信任方式登录,修改sys密码,具体如下: 1.检查 oracle 的network/admin 下的 sqlnet.ora 文件内, 存在 SQLNET.AUTH ...

  3. 【python cookbook】【字符串与文本】8.编写多行模式的正则表达式

    问题:用正则表达式对一段文本块做匹配,但是希望在进行匹配时能够跨越多行 解决方案: 1.正则表达式添加对换行符的支持: 2.re.compile()函数一个有用的标记-re.DOTALL使得正则表达式 ...

  4. 空格和TAB键混用错误:IndentationError: unindent does not match any outer indentation level

    转自:http://www.crifan.com/python_syntax_error_indentationerror/comment-page-1/ [已解决]Python脚本运行出现语法错误: ...

  5. jsp数据库连接出现乱码

    只要涉及中文的地方全部是乱码,解决办法:在数据库的数据库URL中加上 useUnicode=true&characterEncoding=GBK 就OK了. 之前所写,迁移至此 原文链接:ht ...

  6. c#使用word、excel、pdf ——转

    一.C# Word操作引入Word COM组件菜单=>项目=>添加引用=>COM=>Microsoft Word 11.0 Object Libraryusing Word = ...

  7. QQ空间开放平台开发教程-SDK和API的使用

    <?php /** * OpenAPI V3 SDK 示例代码,适用于大部分OpenAPI.如果是上传文件类OpenAPI,请参考本SDK包中的“Test_UploadFile.php”文件中的 ...

  8. 让ecshop用户登录评价以可择匿名评价

    ECSHOP 默认的程序 是 当用户登录后,对商品商品评价是不是能匿名评价的. 有些店铺设置了只能登录评价,但客户又不想显示自己的账号名称.这时候 这功能 就可以派上用场了 1在 comment.ph ...

  9. 给我发邮件(qq)| 和我联系

    qq邮箱开放平台(只能是qq对qq): 简单点的发邮件: 和我联系

  10. java JPEGImageEncoder;图像处理

    在Eclipse中处理图片,需要引入两个包: import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JP ...