python_way,day4

1、内置函数 - 下

制作一个随机验证码

2、装饰器


1、内置函数 - 下

  1. callable() #对象能否被调用
  2. chr()    #10进制数字对应的ascii码表中的内容
  3. ord()    #查询对应的ascii码表中的元素的位置
        chr(65) A
  4.     ord(A) 65
  1. 使用random这个模块和chr()写一个生成验证码的功能。
  2.  
  3. import random
  4.  
  5. li = []
  6. def num():
  7. """
  8. 生成一个随机的元素,这个元素可能是大写字母,小写字母还有数字。
  9. :return: 随机的英文或者数字
  10. """
  11. b=random.randrange(0,5)
  12. #生成一个数字
  13. if b == 2 or b == 5: #这个随机的数字如果等于2 或者 5 的时候
  14. a = random.randrange(97,122) #a 等于 97 -- 122 之间的一个数字
  15. small = chr(a) # 这个数字在ascii码中对应的位置是小写字母的位置
  16. return small #返回出来
  17. elif b == 1 or b == 6:
  18. a = random.randrange(65,90)
  19. big = chr(a) #同理,这个范围是大写字母的范围
  20. return big
  21. else:
  22. a = random.randrange(1,10) #都不是则返回的是1-9的数字
  23. return str(a)
  24.  
  25. def auth_num():
  26. l = []
  27. for i in range(6): #循环6次
  28. l.append(num()) #每次将上面生成的随机数插入到l这个 空列表中,6次后则生成了一个6位的随机数
  29. s = "".join(l) #将列表转成字符串
  30. return s
  31.  
  32. a = auth_num()
  33. print(a)
  1. compile() #编译代码
        python解释器读取python文件的过程:
        读取文件内容 open() 转成str放到内存
  • python如何能能知道这些str是什么语法?      
  1.     python内部把字符串 -----> 编译成python认识的特殊代码 ----> 执行代码
    s = "print(123)"
      r = compile(s,"<string>","exec") 用来编译代码
  • 如果第二位不加 <string> 前面的s就要传一个文件
  1.   print(r)
      <code object <module> at 0x0000005A65327C00, file "<string>", line 1>
      这个就是将s编译成为了python认识的代码
      然后python再用exec()去执行这段代码
      s 这个位置也可以是一个文件
    5 exec()
  • exec能执行python任意的代码
  • exec可以直接接受一个没有被编译的字符串直接执行。也可以接收一个编译好的对象。
  1.   execr
      123 # 就得到了 s 这个字符串 print 这个执行的结果了
      #exec() 是能执行代码但是没有返回结果
  1. 6 eval()
  • eval是只能执行一个表达式,但是他有返回结果
  1.   a = eval("1+2+3")
      print(a)
    6
    7 dir() #获得一个类提供了那些功能
  2.  
  3. 8 help() #查看帮助
  4.  
  5. 9 divmode() #计算数字取余数和商数
      a = divmod(100,7)
      print(a)
      获得一个元组(14,2
  6.  
  7. 10 isinstence() #查看一个对象是否属于某个类
      s = "123"
      a = isinstance(s,str)
      print(a)
      True
  8.  
  9. 11 filter() & map()

首先先做一个需求

  1. li = [11,22,33,44,55]
  2. #写一个函数,只要大于33的元素
  3. def f1(arg):
  4. min_list = []
  5. for i in arg:
  6. if i > 22:
  7. min_list.append(i)
  8. return min_list
  9.  
  10. a = f1(li)
  11. print(a)
  12. [33,44,55]

filter()就可以实现上面的功能

  • fileter(函数,可迭代对象)
  1. 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

  1. print(f1(li))
    [111,122,133,144,155]
  1. map()就是来实现上面的功能的
    map(函数,可迭代的对象)
      li = [11,22,33,44,55]
      ret = map(lambda:a+100,li)
      print(list(ret))
      [111, 122, 133, 144, 155]

原理:

map先遍历li列表中的内一个每元素,然后将这个元素放到前面的函数中去执行,并将执行结果返回出来。

简单的说:将函数的返回值添加到结果中

  1. 12 frozenset() #将一个对象编程不能变的集合。
  2. s = {11,22,33}
  3.   ret = frozenset(s)
  4.   print(ret)
  5.   frozenset({33, 11, 22})
  1.    t = (11,11,22,33)
      ret = frozenset(t)
      print(ret)
      frozenset({33, 11, 22})

 

  1. 13globals() & locals()
  2. globals() 代表着所有的全局变量
  3. locals()代表着所有的局部变量
  1. def f1():
    a = 123
    print(globals())
    print(locals())
  2.  
  3. 这样就会找出所有的全局变量和局部变量。
    全局变量中包括:自定义的全局变量和内置的全局变量
  1.  

2、装饰器:

  1. def outer(func):
  2. def inner():
  3. print("log")
  4. return func()
  5. return inner
  6.  
  7. @outer
    def f1()
      print("F1")

装饰器原理1:

  1. def f1():
  2. print(123)
  3.  
  4. def f1():
  5. print(456)
  6.  
  7. f1()
  8.  
  9. 当执行f1的时候我们得到的结果是 456
  10.  
  11. 因为函数执行有先后顺序,最后一次执行的456把之前执行的123覆盖了。

装饰器原理2

  1. def f1():
  2. print(123)
  3.  
  4. def f2(arg):
  5. arg()
  6.  
  7. f2(f1)
  8. 结果是把f1当做整体传给了f2f2的内部则是对这个传入的对象进行调用
  9.  
  10. 结果就是执行了f1()

先说说装饰器的功能:

1、自动执行outer函数:相当于@outer是 自动执行outer()

2、将下面的函数名f1当做参数传递给outer(f1)

3、将outer函数的返回值重新赋值给f1

  1. 此时如果outer()内部是这样的
  2.  
  3. def outer(func)
  4. pirnt(123,func)
       return 111
  5.  
  6. @outer
  7. def f1():
  8. print(123)
  1.  
  2. 结果就是
  3. 123,   <function f1 at 0x00000345332>
    执行outerf1函数对象被当成参数传给了func这个形参
  4.  
  5. 所以就证明了上面的12结论
  6.  
  7. 第三结论就是
    当执行@outer的时候,就会把outer()返回值重新赋值给f1
    就相当于 f1=“111
  8.  
  9. 所以此时即便上面我们定义了f1的函数,但是又相当于给f1重新赋值了111,所以上面定义的就没有效果了。
  1. 在用装饰器之前 f1对象内存为
    <function f1 at 0x000000CE29CEF158>
    执行装饰器后f1的地址则发生了改变,就证明了第3个功能
    <function f1 at 0x00000014EDB80268>
  1.  

上面我们的outer 返回值时111,那么我们也可以给他返回一个函数:

  1. def outerfunc
  2. def inner()
  3. print('before')
  4. return inner
  5.  
  6. @outer
    def f1():
      print('F1')
  1. def f1():
  2. print("")
  3.  
  4. def f2():
  5. print(666)
  6.  
  7. f1=f2
  8. print(f1())

666   (print内容)
None (由于f2没有指定return,所以返回值为None)

        

一个函数体f2赋值给另一个函数体f1,执行后就相当于赋值后的函数体f2:

但是此时我们只是简单的把inner的功能赋值给了f1,我们是要把f1的功能保留并且新增加一个inner中的功能

那么我们应该怎么办??

我们只要把返回给f1的inner中加一条引用刚刚传进outer时的f1,就可以把f1功能加进来了。

  1. def outer(func):
  2. def inner():
  3. print("before")
  4. func()
  5. return inner

# func就是刚刚传入的f1

#此时我们发现我们成功的将f1函数改变了。但是我们的初衷是不改变原函数,并对其效果增加功def outer(func)

  1. 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
  2. f1('F1')
  3. 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. django中request对象详解(转载)

    django中的request对象详解 Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将  HttpRequest对象  作为第一个参数传入该函数. ...

  2. JS 动态加载脚本 执行回调_转

    关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解 ...

  3. Getting Started with the C# Driver

    1.下载 如果下载的.zip文件,只需要解压即可. 如果安装的.msi文件,它会将C#驱动DLL放在C:\Program Files (x86)\MongoDB\CSharp Driver xxx的位 ...

  4. webconfig简单加密解密

    <?xml version="1.0"?><configuration> <configSections> <section name=& ...

  5. redis初试牛刀

    先来无事就学学redis.可是并没有想的那么美好.首先要解释一下,redis主流是安装在lunx系统中的,甚至官网直接没有给出windows版本.要下载windows只能去所谓的githup.好吧我在 ...

  6. JAVA基础知识之IO——IO流(Stream)的概念

    Java IO 流 Java将不同的设备或载体(键盘.文件.网络.管道等)的输入输出数据统称为"流"(Stream),即JAVA的IO都是基于流的. JAVA传统的所有流类型类都包 ...

  7. Uva 1220,Hali-Bula 的晚会

    题目链接:https://uva.onlinejudge.org/external/12/1220.pdf 题意: 公司n个人,形成一个数状结构,选出最大独立集,并且看是否是唯一解. 分析: d(i) ...

  8. uva 437,巴比伦塔

    题目链接:https://uva.onlinejudge.org/external/4/437.pdf 题意:巴比伦塔: 给出n种立方体,一个立方体能放到另一个立方体上,必须满足,底面一定要小于下面的 ...

  9. 系统调优之numa架构

    NUMA简介 在传统的对称多处理器(SMP, Symmetric Multiprocessing)系统中,整个计算机中的所有cpu共享一个单独的内存控制器.当所有的cpu同时访问内存时,这个内存控制器 ...

  10. mvcAPI (入门 3)

    续上 1)无参数Get请求 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> < ...