首页 > 其他 > 详细

No.12函数(四)

时间:2020-03-19 09:06:22      阅读:41      评论:0      收藏:0      [点我收藏+]

No.12

今日概要

  • 函数中高级(闭包/高阶函数)
  • 内置函数
  • 内置模块(.py文件)

内容回顾和补充

1.回顾

  • 函数概念

    • 基本结构

      def func(arg):
          return arg
      v = func(123)
    • 参数

      • 定义函数

        • def func(a1,a2): pass
        • def func(a1,a2=None): pass 一个函数写默认值时一定要放后面。
        • def func(*args,**kwargs): pass
      • 调用函数

        • 位置参数在前 / 关键字参数在后
      • 函数小高级

        • 函数可以做变量

          def func():
              pass
          v = func()
          v()
          
          v2 = [func,func,func]
          v2[1]()
        • 函数可以做参数

          def func(arg)
              v2 = arg()
          
          def show()
              pass
          
          v1 = func(show)
          #注意返回值,func给v1,show给v2
        • 函数的作用域

          示例一
          for item in range(10):
              pass
          print(item)
          
          示例二
          item = 10
          def func():
              for item in range(10):
                  pass
              print(item)
          func()
          
          示例三
          item = 10
          def func():
              item = 2
              def inner():
                  print(item)
              for item in range(10):
                  pass
              inner()
          func()
          
          #面试题
          def func():
              for num in range(10):
                  pass
              v4 = [lambda :num+10,lambda :num+100,lambda :num+100]
              result1 = v4[1]()
              result2 = v4[2]()
              print(result1,result2)
          func()
        • lambda表达式(匿名函数)

          def func():
              pass
          
          v = [lambda x:x+100,]
        • 内置函数

          • 输入输出

            • input()
            • print()
          • 强制转换

            • int()
            • float()
            • bool()
            • str()
            • list()
            • tuple()
            • dict()
            • set()
          • 数学相关

            • max()

            • min()

            • sum()

            • abs()

            • divmod() ▲求商和余数,分页使用。

            • pow()

              v = pow(2,3)
              print(v)
            • round()

              v = round(1.126,2)
              print(v)
          • 进制相关

            • bin() ▲
            • oct()
            • int() ▲
            • hex()
          • 其它 ▲

            • len()
            • range()
            • id()
            • type()
            • open()

2.补充

  1. 数据类型中的方法到底有没有返回值?

    • 无返回值

      v = [11,22,33]
      v.append(66) #无返回值
    • 仅有返回值

      v = 'alex'
      result = v.split('l')
      
      v = {'k1':'v1'}
      result1 = v.get('k1')
      result2 = v.keys()
    • 有返回值 + 修改数据

      v = [11,22,33]
      result = v.pop()
    • 常用需要记住

      • str
        • strip 返回字符串
        • split 返回列表
        • replace 返回字符串
        • join 返回字符串
      • list
        • append 无返回值
        • insert 无
        • pop 返回要删除的数据
        • remove 无
        • index 返回索引的位置
      • dict
        • get
        • keys
        • values
        • items
  2. 一个函数被同时执行时内部数据是否混乱?
    • 函数内部执行时相互之间不会混乱
    • 执行完毕 + 内部元素不被使用 → 销毁

内容详细

1.函数的中高级

1.1函数可以做返回值

def func():
    print(123)
    
def bar():
    return func

v = bar()
v()
name = 'oldboy'
def func():
    print(name)
    
def bar():
    return func

v = bar()
v()
def bar():
    def inner():
        print(123)
    return inner

v = bar()
v()
name = 'oldboy'
def bar():
    name = 'alex'
    def inner():
        print(name)
    return inner

v = bar()
v()
name = 'oldboy'
def bar(name):
    def inner():
        print(name)
    return inner

v1 = bar('alex') #{name=alex,inner1的地址}   
v2 = bar('eric') #{name=eric,inner2的地址}
v1()
v2()
#闭包:为函数创建一块区域(内部变量供自己使用),为它以后执行提供数据。

习题

#第一题
name = 'alex'
def base():
    print(name)
def func():
    name = 'eric'
    base()
func()
#第二题
name = 'alex'
def func():
    name = 'eric'
    def base()
        print(name)
    base()   
func()
#第三题
name = 'alex'
def func():
    name = 'eric'
    def base():
        print(name)
    return base
base = func()
base()

面试题

info = []
def func():
    print(item)
for item in range(10):
    info.append(func)
info[0]()
info = []
def func(i):
    def inner()
        print(i)
    return inner
for item in range(10):
    info.append(func(item))
info[0]()
info[1]()
info[2]()

1.2闭包

def func(name):
    def inner():
        print(name)
    return inner

v1 = func('alex')
v2 = func('eric')
#外部函数嵌套内部函数,且返回内部函数地址,这样会保留每次创建内部函数时,外部函数里面的数据。 

1.3高阶函数

  • 把函数当作参数传递
  • 把函数当作返回值

注意:对函数进行赋值

1.4总结

  • 函数执行的流程分析
  • 闭包的概念:为函数创建一块区域保留并为其维护自己的数据,以后执行时方便调用。(应用场景:装饰器/SQLAlchemy源码)

2.内置函数

  • 编码相关

    • chr() 将十进制数字转换成unicode编码中对应的字符串。

      v = chr(100)
      print(v)
    • ord() 根据字符在unicode编码中找到对应的十进制。

      v = ord('中')
      print(v)
    • 应用

      #随机验证码
      import random
      def get_random_code(length=6):
          data = []
          for i in range(6):
              v = random.randint(65,90)
              data.append(chr(v))
          return (''.join(data))
      
      code = get_random_code()
      print(code)
      import random #导入一个模块(导入一个py文件)
      
      random.randint(起始,终止) #得到一个随机数
  • 高级一点的内置函数

    • map 循环每个元素(第二个参数),然后让每个元素执行函数(第一个函数),最后将函数执行的结果放到新的列表中并返回。

      v1 = [11,22,33,44]
      # 第一个参数必须是一个函数
      # 第二个参数必须是可迭代类型(可以被for循环的)
      result = map(lambda x:x+100,v1)     # 将函数的返回值添加到空列表中
      print(result)                       # [111,122,133,144] py2会直接返回
      print(result)                       # py3返回特殊的东西
      print(list(result))                 # py3通过列表转换得到
      print(v1)                           # map有返回值,不会影响v1。

      应用场景:如果要对列表字典中每个元素做统一操作可以使用map()函数

    • filter 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用list()来转换。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

      v1 = [11,22,33,'alex',44,'eric']
      
      def func(x):
          if type(x) == int:
              return True
          return False
      result = filter(func,v1)   # 函数,可迭代对象
      print(list(result))
      
      result = filter(lambda x: type(x) == int, v1)
      print(list(result))
    • reduce

      import functools
      v1 = [1,2,3,4,5,6]
      def func(x,y):
          return x * y
      result = functools.reduce(func,v1)
      print(result)
      
      import functools
      v1 = ['我','好','饿']
      def func(x,y):
          return x + y
      result = functools.reduce(func,v1)
      print(result)
      
      result = fuctools.reduce(lambda x,y: x + y,v1)
      print(result)
  • 面试题

    • 你常用的内置函数有哪些?
    • filter / map / reduce 是什么意思?

3.模块

将指定的字符串进行加密

import hashlib   #导入模块
def get_md5(data):
    obj = hashlib.md5()    #md5加密
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result

val = get_md5('123')
print(val)

加盐

import hashlib   
def get_md5(data):
    obj = hashlib.md5('随便写'.encode('utf-8'))    
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result

val = get_md5('123')
print(val)

应用

import hashlib   #导入模块
def get_md5(data):
    obj = hashlib.md5()    #md5加密
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result

USER_LIST = []
def register():
    print('******注册账户******')
    while True:
        user = input('请输入用户名:')
        if user == 'n':
            return
        pwd = input('请输入密码:')
        temp = {'name': user,'password':get_md5(pwd)}
        USER_LIST.append(temp)
register()

def login():
    print('******用户登录******')
    user = input('请输入用户名:')
    pwd = input('请输入密码:')
    for item in USER_LIST:
        if item['name'] == user and item['password'] == get_md5(pwd):
            return True

result = login()
if result:
    print('登陆成功')
else:
    print('登陆失败')

赠送:密码不显示(只能在终端运行)

import getpass

pwd = getpass.getpass('请输入密码:')  
if pwd == '123':
    print('输入正确')

总结

  • 自定义函数
    • 基本函数结构(98%)
    • 高级
      • 参数
      • 闭包
  • 内置函数
  • 模块
    • random
    • hashlib
    • getpass

No.12函数(四)

原文:https://www.cnblogs.com/elliottwave/p/12521813.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!