python_way,day4

python_way,day4

1、内置函数 - 下

2、装饰器


1、内置函数 - 下

1 callable() #对象能否被调用
2 chr()    #10进制数字对应的ascii码表中的内容
3 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) 
4 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)   67 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()

首先先做一个需求

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

@outerdef 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=“666”

所以此时几遍上面我们定义了f1的函数,但是此时有相当于给f1重新赋值了666,所以上面定义的就没有效果了。
在用装饰器之前 f1对象内存为<function f1 at 0x000000CE29CEF158>执行装饰器后f1的地址则发生了改变,就证明了第3个功能<function f1 at 0x00000014EDB80268>
 

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

def  outer(func)
    def inner()
        print(‘before‘)
    return  inner

@outerdef f1():  print(‘F1‘)
def f1():
    print("123")

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 func(arg)            return outer    @outer             def f1(arg):  print(arg)  return arg

f1(‘F1‘)

before F1after 
时间: 2024-12-11 13:50:16

python_way,day4的相关文章

python_way day6 反射,正则 模块

python_way day6 反射 正则 模块 一.模块: 1.sys & os: 我们在写项目的时候,经常遇到模块互相调用的情况,但是在不同的模块下我们通过什么去可以找到这些模块的位置哪? 那就是环境变量! 如何查看当前的环境变量?a = sys.pathprint(a)['D:\\资料\\python\\oldboy13\\jobs\\day5\\conf', 'D:\\资料\\python\\python35\\lib\\site-packages\\requests-2.10.0-py

day4

day4: 经过一天的考试与测评,我发现自己在审题和考虑情况方面有很大的不足,以后要留意不同数据出现时发生的所有情况,不要遗漏数据输出时使用的库. #include〈iostream〉 using namespace std: int main() { int n,m; cin>>m>>n; for(int i=1;i<=m;i++) { for(int j=1;j<n;j++) cout<<'*'<<' '; cout<<'*'&l

python_way.day7 模块(configparser,xml,shutil,subprocess)、面向对象(上)(创建类,类的构成,函数式编程与面向对象编程的选择,类的继承)

python_way.day7 1.模块 configparser,xml,shutil,subprocess 2.面向对象(上) 创建类,类的构成,函数式编程与面向对象编程的选择,类的继承 1.模块 configparser 用于处理特定格式的文件,其本职上使用open来操作,只能是  [test1] 特定的格式 [test1] k1 = 123 k2 = True [test2] k1 = 123 k2 = v1 文件内容 1.获取 import configparser #打开文件找到文件

leetcode day4 -- Binary Tree Postorder(Preorder) Traversal &amp;&amp; Edit Distance

 1.Binary Tree Postorder Traversal Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive solution is trivial, could you do it iteratively? 分析:后续遍历

day4 迭代器与生成器解析

一.迭代器 迭代器是访问集合元素的一种方式.其实迭代器就是一种列表,只是访问集合元素的时候比较特殊,具有一些特定功能,记忆功能,能够记住用户上一次的状态.迭代器是访问集合元素的一种方式.并且,迭代器只能前进,不能后退.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 特定: (1).访问者不需要关心迭代器内部的文件,仅需通过next()方法不断去取下一个内容: (2).不能随机访问集合中的某个值,只能从头到尾依次访问: (3).访问到一半时不能往回退: (4).便于循环比较大的

python_way day18 html-day4, 模板

python_way day18 html-day4 模板语言之母板的使用 在我们写一些后台管理页面的时候,因为后台的样式,布局基本一致,只有页面右侧数据展示部分不同,我们就为了省去重复的写多个一样的页面就还可以使用模板的母板功能,类似于写一个函数,每次调用这个函数就可以完成相同的工作了. 母板: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

python_way day17 前段插件(fontawsome,easyui,bootstrap,jqueryui,bxslider,jquerylazyload),web框架

python_way day17 一.模板插件 图标的插件 fontawsome: 后台管理: easyui jqueryui 很多网站都会用: bootstrap :引入jQuery:(2.x,1.1.) :引入js bootstrap模板: bootstrap后台管理模板: bxslider:轮播图 jquerylazyload:延迟加载,所有的图片延迟加载 http://www.cnblogs.com/wupeiqi/articles/5813161.html faulure_limit:

python_way day16 JavaScirpt(re)、 DOM 、 jQuery、

Python_way day16 1.Dom  (找到html中的标签) 2.Javascirpt(正则) 3.jQuery(1.10,1.12-兼容性好,2.0.以后放弃了ie9以下) - 封装了Dom & JavaScript 一.DOM 1.查找元素 直接查找 document.getElementById 根据ID获取一个标签 --->这里是获取一个标签中间没有s document.getElementsByName 根据name属性获取标签集合 document.getElemen

python_way ,day2 字符串,列表,字典,时间模块

python_way ,day2 字符串,列表,字典,时间模块 1.input: 2.0 3.0 区别 2.0中 如果要要用户交互输入字符串: name=raw_input() 如果 name=input() 是传什么就是对应的什么,想输入字符串需要加 “” 引号,如果要是不加就认为传入的是个变量. a="hahaha"user=input("shuru :")print(user) shuru :a hahaha 3.0中 只有 input() 了 所以在inpu