码迷,mamicode.com
首页 > 编程语言 > 详细

python函数(二)

时间:2019-04-17 20:51:51      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:tool   append   ret   false   abs   最小   strip   参数   推导式   

5.2.6 函数可以当作参数进行传递
def func(arg):
    arg()
def ggg():
    print(123)
func(ggg)#输出就结果为123
def func(arg):
    v1 = arg()
    print(v1)

def show():
    print(666)

result = func(show)
print(result)

5.2.6 lambda表达式

  • 用于表达就简单函数

    # 三元运算,为了解决简单的if else的情况,如:
    if 1 == 1:
      a = 123
    else:
      a = 456
    
    a =  123  if 1 == 1 else 456
    
    # lambda表达式,为了解决简单函数的情况,如:
    def func(a1,a2):
      return a1 + 100 
    
    func = lambda a1,a2: a1+100
    
    #列表的所有方法基本上返回值都是none,字符串的所有方法都是返回新的值

练习题

# 练习题1
USER_LIST = []
def func0(x):
    v = USER_LIST.append(x)
    return v 

result = func0(‘alex‘)
print(result)

# 练习题2

def func0(x):
    v = x.strip()
    return v 

result = func0(‘ alex ‘)
print(result)

############## 总结:列表所有方法基本上都是返回None;字符串的所有方法基本上都是返回新值 #################
# 练习题3
USER_LIST = []
func1 = lambda x: USER_LIST.append(x)

v1 = func1(‘alex‘)
print(v1)
print(USER_LIST)

# 练习题4
func1 = lambda x: x.split(‘l‘)

v1 = func1(‘alex‘)
print(v1)

# 练习题5
func_list = [lambda x:x.strip(), lambda y:y+199,lambda x,y:x+y]

v1 = func_list[0](‘alex ‘)
print(v1)

v2 = func_list[1](100)
print(v2)

v3 = func_list[2](1,2)
print(v3)

5.2.7 内置函数

  • 内置函数

    • 其他

    • len
    • open
    • range
    • id
    • type

    • 输入输出

    • print
    • input

    • 强制转换

    • dict()
    • list()
    • tuple()
    • int()
    • str()
    • bool()
    • set()

    • pow

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

      v = round(1.127,2)
      print(v)
    • 编码相关

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

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

      num = ord(‘中‘)
    • 应用:

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

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

      v1 = [11,22,33,44]
      result = map(lambda x:x+100,v1)
      print(list(result)) # 特殊
    • filter

      v1 = [11,22,33,‘asd‘,44,‘xf‘]
      
      def func(x):
        if type(x) == int:
            return True
        return False
      result = filter(func,v1) # [11,]
      print(list(result))
      
      result = filter(lambda x: True if type(x) == int else False ,v1)
      print(list(result))
      
      result = filter(lambda x: type(x) == int ,v1)
      print(list(result))
    • reduce

      import functools
      v1 = [‘wo‘,‘hao‘,‘e‘]
      
      def func(x,y):
        return x+y
      result = functools.reduce(func,v1) 
      print(result)
      
      result = functools.reduce(lambda x,y:x+y,v1)
      print(result)
  • 数学相关

    • abs,绝对值
    v = abs(-1)
    print(v)#得到1,求出数字的绝对值
    • float,转换成浮点型(小数)
    v = 55
    v1 = float(55)
    print(v1)
    • max,找到最大值
    v = [1,2,311,21,3,]
    result = max(v)
    print(result)#输出311找到最大值
    • min,找最小值
    v = [1,2,311,21,3,]
    result = min(v)
    print(result)
    • sum,求和
    v = [1,2,311,21,3,]
    result = sum(v)
    print(result)#求和
    • divmod,两数相除的商和余数
    a,b = divmod(1001,5)
    print(a,b)
    # 练习题  请通过分页对数据进行展示
    """
    要求:
        每页显示10条数据
        让用户输入要查看的页面:页码
    """
    
    USER_LIST = []
    for i in range(1,836):
        temp = {‘name‘:‘你少妻-%s‘ %i,‘email‘:‘123%s@qq.com‘ %i }
        USER_LIST.append(temp)
    
    # 数据总条数
    total_count = len(USER_LIST)
    
    # 每页显示10条
    per_page_count= 10
    
    # 总页码数
    max_page_num,a = divmod(total_count,per_page_count)
    if a>0:
        max_page_num += 1
    
    while True:
        pager = int(input(‘要查看第几页:‘))
        if pager < 1 or pager > max_page_num:
            print(‘页码不合法,必须是 1 ~ %s‘ %max_page_num )
        else:
            """
            # 第1页:USER_LIST[0:10] -> 0123456789
            # 第2页:USER_LIST[10:20]
            # 第3页:USER_LIST[20:30]
            ...
            """
            start = (pager-1) * per_page_count
            end = pager * per_page_count
            data = USER_LIST[start:end]
            for item in data:
                print(item)
  • 进制转换相关

    • bin,将十进制转化成二进制
    num = 13
    v1 = bin(num)
    print(v1)
    • oct,将十进制转换成八进制
    num = 8
    v1 = oct(num)
    print(v1)
    • int,将其他进制转化成十进制
    # 二进制转化成十进制
    v1 = ‘0b1101‘
    result = int(v1,base=2)
    print(result)
    
    # 八进制转化成十进制
    v1 = ‘0o1101‘
    result = int(v1,base=8)
    print(result)
    
    # 十六进制转化成十进制
    v1 = ‘0x1101‘
    result = int(v1,base=16)
    print(result)
    • hex,将十进制转换成十六进制
    num = 16
    v1 = hex(num)
    print(v1)

5.2.8 函数中高级

5.2.8.1 函数可以作为返回值
def f():
    print(123)
def b():
    return f
v = b()#v就是f函数
v()#执行f函数
5.2.8.2 闭包
  • 闭包应用场景:装饰器,sqlaeilde源码中

  • 闭包的概念:为函数创建一块区域,并维护自己数据,以便以后调用

    def cf():
      def tm():
          print("123")#内层函数需要使用才叫一个闭包
      return tm
    c = cf()#内存地址会保留这次数据的函数执行,到使用c()把tm函数执行使用后内存才会销毁
5.2.8.3 递归
  • 递归(默认python递归最大递归次数1000次)

    def func():#死循环实例
    print(1)
      func()
    func()
    ###################################################
    def func(a,b):#斐波那契数列,递归实现方法
      if a ==5:
        return 500000
      print(b)
      func(b,a+b)
    func(0,1)
  • 用这个模块就可以查看递归次数

技术图片

  • 递归效率不高,尽量减少用递归。用while代替

    # 递归的返回值
    def func(a):
      if a == 5:
          return 100000
      result = func(a+1) + 10
    
    v = func(1)
    name = ‘alex‘
    def func():
      def inner():
          print(name)
       return inner
    v =func()

5.3 推导式&装饰器

5.3.1 装饰器

  • 在不改变原函数代码的前提下,让函数在之前之后做些操作
  • 装饰器准则:
    • 变量的赋值
    • 看看return的是什么
    • 自己没有去上级作用域找
def func():
    pass
v = func
v()
######################################################
def base():
    print(1)
    pass
def bar():
    print(2)
    pass
base = bar
base()#执行bar函数
#####################################################
重点:(记住格式以及执行原理)
def func(arg):
    def iner():
        mun  = arg()
        print(mun)
        return mun
    return iner

@func#执行func函数并把下面参数传递相当于func(index),将func的返回值重新赋值给下面的函数名相当于index = func(index)
def index():
    print(123)
    return 666
index()
def x(func):
    def inner(a1,a2):
        return func(a1,a2)
    return inner 

@x
def index(a1,a2):
    pass

# index = inner
index(1,2)

# ################################### 参数统一的目的是为了给原来的index函数传参
def x(func):
    def inner(a1,a2):
        return func()
    return inner 

@x
def index():
    pass
# func = 原来的index函数u
# index = inner
index(1,2)
  • 装饰器应用

    # 计算函数执行时间
    
    def wrapper(func):
      def inner():
          start_time = time.time()
          v = func()
          end_time = time.time()
          print(end_time-start_time)
          return v
      return inner
    
    @wrapper
    def func1():
      time.sleep(2)
      print(123)
    @wrapper
    def func2():
      time.sleep(1)
      print(123)
    
    def func3():
      time.sleep(1.5)
      print(123)
    
    func1()
  • 装饰器应用场景:想要为函数拓展功能时,可以选择用装饰器

    装饰器编写格式
    def func(参数):
      def iner(*args,**kwargs):
          mun  = arg(*args,**kwargs)
          return 参数()
      return iner内层函数
  • 装饰器应用格式

    @外层函数
    def index():
      print(123)
      return 666
    使用函数index()
  • 带参数的装饰器场景:常见在flask框架中,让装饰器实现函数要执行N次

  • 关于参数

  • 关于返回值
5.3.1.1 带参数的装饰器
  • 带参数的装饰器实例:

    def x(counter):#实现效果@x几次输入几次执行,并返回结果以列表呈现
    def wad(func):
          def inte(*args,**kwargs):
              a = []
              for i in range(counter):
                  e = func(*args,**kwargs)
                  a.append(e)
              return a
          return inte
      return wad
    @x(10)
    def gg(c):
      print(c)

5.3.2 推导式

  • 列表推导式

    • 基本格式
    目的方便的生成一个列表
    方式一
    vp = [i for i in "alex"#可迭代对象]
    print(vp)#输出["a","l","e","x"]
    方式二
    vp = [i+100 for i in range(5)]
    print(vp)#输出[100,101,102,103,104]
    """
    目的:方便的生成一个列表。
    格式:
        v1 = [i for i in 可迭代对象 ]
        v2 = [i for i in 可迭代对象 if 条件 ] # 条件为true才进行append
    """
    v1 = [ i for i in ‘alex‘ ]  
    v2 = [i+100 for i in range(10)]
    v3 = [99 if i>5 else 66  for i in range(10)]
    
    def func():
        return 100
    v4 = [func for i in range(10)]
    
    v5 = [lambda : 100 for i in range(10)]
    result = v5[9]()
    
    def func():
        return i
    v6 = [func for i in range(10)]
    result = v6[5]()
    
    v7 = [lambda :i for i in range(10)]
    result = v7[5]()
    
    v8 = [lambda x:x*i for i in range(10)] # 新浪微博面试题
    # 1.请问 v8 是什么?
    # 2.请问 v8[0](2) 的结果是什么?
    
    # 面试题
    def num():
        return [lambda x:i*x for i in range(4)]
    # num() -> [函数,函数,函数,函数]
    print([ m(2) for m in num() ]) # [6,6,6,6]
    
    # ##################### 筛选 #########################
    v9 = [i for i in range(10) if i > 5]
  • 集合推导式

    • 基本格式
    vp = set(i for in "alex")
  • 字典推导式

    v1 = {"k"+str(i):i for i in range(10)}

python函数(二)

标签:tool   append   ret   false   abs   最小   strip   参数   推导式   

原文地址:https://blog.51cto.com/11985686/2380400

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!