三元表达式,各种生成式,匿名函数,常见重要内置函数

三元表达式

  三元表达式,也称为if,else的紧凑形式。具体用法如下
  def max(a,b):
      if a>b:
          return a
      else:
          return b
  def max(a,b):
      return a if a>b else b
  上面这两个函数实现的功能是完全一样的。第二个函数中 a if a>b else b 就是一个三元表达式。 左边是条
件为真时返回的值,中间是判断条件,右边是条件假返回的值。

  """
  三元表达式
      值1 if 条件 else 值2
  条件如果成立则使用值1(if前面的数据)
  条件如果不成立则使用值2(else后面的数据)
  """
  # 补充:针对if分支结构 也有简化版本(了解即可)
  '''子代码块都只有简单的一行情况下 也可以简写  没有三元表达式简单 但是也有人用'''
  name = '春游去动物园'
  if name == '春游去动物园': print(name)
  else: print('秋游去动物园')

各种生成式

列表生成式

  '''
    大致的格式如下 [表达式 for 变量 in 列表 if 条件] ,其中if条件是可选的。
  '''
  a = [i**2 for i in range(10)]
  print(a)
  #[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

  类似数学中的乘法分配律
  a = [x*y for x in [1,2,3] for y in [4,5,6]]
  print(a)
  #[4, 5, 6, 8, 10, 12, 12, 15, 18]
  
  列表生成式复杂用法:还具备筛选能力
  a = [i for i in range(10) if i>=5]
  print(a)
  #[5, 6, 7, 8, 9]
  
  '''列表生成式中值允许出现for和if 不能出现else 因为会产生歧义(for和if都能结合else)'''

字典生成式

  #定义两个列表(索引值必须相等)
  list1 = ['a','b','c','d']
  list2 = ['1','2','3','4']
  字典生成式
  dic = {list1[i]:list2[i] for i in range(len(list1))}
  print(dic)
  执行结果:
  {'a': '1', 'b': '2', 'c': '3', 'd': '4'}

  #实现字典的key和value快速交换:
  dic1={'a':1,'b':2}
  dic2={v: k for k, v in dic1.items()}
  print(dic2)  #{1: 'a', 2: 'b'}

集合生成器

  a = {i for i in range(10)}
  print(a)
  #{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
  a = {i for i in range(10) if i != 2}
  print(a)
  #{0, 1, 3, 4, 5, 6, 7, 8, 9}

匿名函数

  1.概念
    匿名函数其实就是lambda表达式
    语法 :   lambda 形参列表:函数体
    
    # 匿名函数
    def text(x, y):
        result = x + y
     
    lambda x, y: x + y
    """
        def text(x, y) 是def的声明部分,return x+y 是实现部分
        lambda x,y是声明部分,x + y是实现部分
    """

匿名函数和正常函数的区别

  def test():
      print("test")
   
   
  # 打印出函数,和函数的类型
  print(test, type(test))
  test()  # 调用函数
  '''
      匿名函数不需要使用return进行值的返回,只需要将结果书写在函数体的部分,
      值会被自动返回
  '''
  r1 = lambda: True
  print(r1,type(r1))
  print(r1())
  执行结果
  <function test at 0x01BA96A0> <class 'function'>
  test
  <function <lambda> at 0x01CC2E38> <class 'function'>
  True

  根据运行结果可以发现,

  定义的函数,有test的函数名称,而使用匿名函数的 没有名称 函数的名称为 lambda函数

  正常的函数调用时直接函数名(),而使用匿名函数是需要打印,或者赋值打印的

匿名函数的函数体可以直接写打印语句,但是返回值则为None

  def test1():
      print("test1")
   
  print(test1())
  r2 = lambda: print("lambda_print")
  print(r2())
  执行结果
  test1
  None
  lambda_print
  None

有参数的匿名函数

  r1 = lambda x: x ** 3  # 传递一个x,然后给x三次方,并返回
  print(r1(2))  # 打印2的三次方

  r2 = lambda x, y: x + y  # 传递一个x和y,然后给相加,并返回
  print(r2(3, 5))  # 打印3+5
  执行结果
  8
  8

匿名函数可以使用默认参数,关键字参数,不定长参数

  r1 = lambda x, y=5: x + y  # 默认参数
  print(r1(2))
  print(r1(2, 10))
  print(r1(x=8, y=9))  # 关键字参数

  r2 = lambda *a: a  # 不定长参数 ,*a:代表可以输入多个或者0个值
  print(r2(1, 2, 3, 4, 5, 6))
  执行结果
  7
  12
  17
  (1, 2, 3, 4, 5, 6)

常见重要内置函数

  1.map映射
    map:使用指定方法去作用传入的每个可迭代对象的元素,生成新的可迭代对象
    l1 = [11, 22, 33, 44, 55]
    res = map(lambda x: x + 10, l1)
    print(list(res))  # [21, 32, 43, 54, 65]

  2.zip
    zip:聚合传入的每个迭代器中相同位置的元素,返回一个新的元组类型迭代器
    x = [1, 2, 3]  # 长度3
    y = [4, 5, 6, 7, 8]  # 长度5
    print(zip(x, y))  # <zip object at 0x01739F48>
    print(list(zip(x, y)))  # 取最小长度3 [(1, 4), (2, 5), (3, 6)]

    '''zip可以整合多个数据集,zip可以整合多个数据集 如果数据集之间个数不一致 那么依据短的'''
    
  3.filter
    filter:使用指定方法过滤可迭代对象的元素
    a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    def if_odd(x): #定义奇数判断函数
        return x%2==1
    print(list(filter(if_odd,a))) # [1, 3, 5, 7, 9]
    print(list(filter(lambda x:x%2==1,a))) # [1, 3, 5, 7, 9]

  4.reduce归总
    reduce()函数也是Python内置的一个高阶函数。
    python 3.0以后, reduce已经不在built-in function里了, 要用它就得导包(from functools import reduce)
    reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传
入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
    def f(x, y):
      return x + y
    reduce(f, [1, 3, 5, 7, 9])
    调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:
    先计算头两个元素:f(1, 3),结果为4;
    再把结果和第3个元素计算:f(4, 5),结果为9;
    再把结果和第4个元素计算:f(9, 7),结果为16;
    再把结果和第5个元素计算:f(16, 9),结果为25;
    由于没有更多的元素了,计算结束,返回结果25。

    reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:
    reduce(f, [1, 3, 5, 7, 9], 100)
    结果为125。
    
    我们也可以使用匿名函数:
    from functools import reduce
    L=reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
    print(L) # 15

常见内置函数

  1.abs() 获取绝对值
    print(abs(-666)) # 666
    print(abs(666)) # 666

  2.all和any
    all:判断可迭代对象的每个元素是否都为True值
    any:判断可迭代对象的元素是否有为True值的元素
    print(all([1, 2]))  # 列表中每个元素逻辑值均为True,返回True
    print(all([0, 1, 2]))  # 列表中0的逻辑值为False,返回False
    print(any([0, 1, 2]))  # 列表元素有一个为True,则返回True
    print(any([0, 0]))  # 列表元素全部为False,则返回False
    
  3.bin() oct() hex()
    bin:将整数转换成2进制字符串
    oct:将整数转化成8进制数字符串
    hex:将整数转换成16进制字符串
    
  4.bytes()
    bytes:根据传入的参数创建一个新的不可变字节数组
    bytes('中文','utf-8')
    b'\xe4\xb8\xad\xe6\x96\x87'
    和str配合使用可以实现编码和解码的功能
    a = bytes('中文','utf-8')
    print(a) # b'\xe4\xb8\xad\xe6\x96\x87'
    res1 = str(a, 'utf8')
    print(res1) # 中文

  5.callable()
    callable:检测对象是否可被调用
    a = 1
    def f1():
        pass
    print(callable(a)) #False
    print(callable(f1)) #True

  6.chr()、ord()
    chr:返回整数所对应的Unicode字符
    ord:返回Unicode字符对应的整数
    b = 6666
    print(chr(b)) # ᨊ
    a = '吕'
    print(ord(a)) # 21525
    
  7.dir()
    dir:返回对象或者当前作用域内的属性列表
         返回数据类型可以调用的内置方法(查看对象内部可调用的属性)
    print(dir(666))
    ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', 
    '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__',
    '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__',
    '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', 
    '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', 
    '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', 
    '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__',
    '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', 
    '__xor__', 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 
    'is_integer', 'numerator', 'real', 'to_bytes']
    
  8.divmod()
    divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组
    print(divmod(7, 2)) # (3, 1)
    使用案例:
    """
    可以使用在网站的分页制作上
        问
            总共250条数据 每页展示25条 需要多少页   10页
            总共251条数据 每页展示25条 需要多少页   11页
            总共249条数据 每页展示25条 需要多少页   10页
    """
    def get_page_num(total_num,page_num):  # 后面django分页器使用
        more,others = divmod(total_num, page_num)
        if others:
            more += 1
        print('需要%s页'%more)
    get_page_num(1000,30) # 需要34页

  9.enumerate()
    enumerate:根据可迭代对象创建枚举对象
    seasons = ['Spring', 'Summer', 'Fall', 'Winter']
    print(list(enumerate(seasons)))
    [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
    print(list(enumerate(seasons, start=1)))
    [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
    for i in enumerate(seasons,start=1):
        print(i)
    执行结果
    (1, 'Spring')
    (2, 'Summer')
    (3, 'Fall')
    (4, 'Winter')
    for i,j in enumerate(seasons,start=1):
        print(i,j)
    执行结果
    1 Spring
    2 Summer
    3 Fall
    4 Winter

  10.eval() exec()
    识别字符串中的python代码
    res = """
    for i in range(10):
        print(i)
    """
    eval(res) # 报错 (SyntaxError: invalid syntax)
    exec(res) # 可以正常执行
    区别:
      eval函数:计算指定表达式的值。也就是说它要执行的Python代码只能是单个运算表达式(注意
eval不支持任意形式的赋值操作),而不能是复杂的代码逻辑,这一点和lambda表达式比较相似。
      exec函数:动态执行Python代码。也就是说exec可以执行复杂的Python代码,而不像eval函数那
么样只能计算一个表达式的值。
      eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段。
      eval()函数可以有返回值,而exec()函数返回值永远为None。

课堂练习

'''
  编写一个二分法(快排)和装饰器
	统计二分法(快排)执行的时间 数据自己模拟
'''
import time
def f1(func):
    def f2(*args,**kwargs):
        a = time.time()
        time.sleep(1)
        func(*args,**kwargs)
        b = time.time()
        print('用时:',b-a)
    return f2
arr = [2, 3, 4, 10, 40]

max = len(arr)

@f1
def select_num(arr_list, r, max, min=0):
    if max >= min:
        mid = (max + min) // 2
        if arr_list[mid] == r:
            print('找到了')
            return
        if r < arr[mid]:
            return select_num(arr_list, r, mid - 1, min)
        else:
            return select_num(arr_list, r, max, mid + 1)
    else:
        print('找不到')
        return


select_num(arr, 4, max)  # 找到了
select_num(arr, 1, max)  # 找不到
posted @ 2022-03-22 21:59  春游去动物园  阅读(234)  评论(0编辑  收藏  举报