Day 7 - 推导式及函数

Day 7

推导式

  • 列表推导式

    语法1:

    list = [expression for variable in sequence]

    说明:

    expression - 代表一个表达式

    variable - 表示变量

    sequence - 表示序列

    产生一个新列表,列表中的元素就是每次循环对应的表达式的结果

    等价于:

    list = []
    for variable in sequene:
        list.append(expression)
    
    list1 = [1 for i in range(3)]
    print(list1)                    # [1, 1, 1]
    list2 = [2*x for x in range(5)]
    print(list2)                    # [0, 2, 4, 6, 8]
    
    # 练习1:写一个列表推导式,产生一个列表中的元素满足以下规律:str0,str3,str6,str9,...,str99
    list3 = [f'str{y}' for y in range(0, 100, 3)]
    # list3 = ['str'+str(y) for y in range(0, 100, 3)]
    print(list3)
    

    语法2:

    list = [expression for variable in sequance if condition]

    说明:

    condition - 表示条件

    等价于:

    list = []
    for variable in sequence:
        if conition:
            list.append(expression)
    
    # 练习2:写一个列表推导式,产生一个列表中的元素满足以下规律:str1,str3,str6,str9,...,str99
    list4 = [f'str{z}' for z in range(1, 100) if z == 1 or z % 3 == 0]
    # 三目运算符方法
    list4 = ['str1' if z == 0 else f'str{z}' for z in range(0, 100, 3)]
    print(list4)
    

    语法3:

    list = [expression for variable1 in sequence1 for variable2 in sequence2]

    list = [expression for variable1 in sequence1 for variable2 in sequence2 if condition]

    list = [expression for variable1 in sequence1 if condition1 for variable2 in sequence2 if condition2]

    等价于:

    list =[]
    for variable1 in sequence1:
        if condition1:
            for variable2 in sequence2:
                if condition2:
                    list.append(expression)
    
    list5 = [f'{x}{y}' for x in range(3) for y in 'abc']
    print(list5)			# ['0a', '0b', '0c', '1a', '1b', '1c', '2a', '2b', '2c']
    list6 = [f'{x}{y}' for x in range(20) if x & 1 for y in 'a25bc464899(^%%de' if 'a' <= y <= 'z']
    print(list6)			# ['1a', '1b', '1c', '1d', '1e', '3a', '3b', '3c', '3d', '3e', '5a', '5b', '5c', '5d', '5e', '7a', '7b', '7c', '7d', '7e', '9a', '9b', '9c', '9d', '9e', '11a', '11b', '11c', '11d', '11e', '13a', '13b', '13c', '13d', '13e', '15a', '15b', '15c', '15d', '15e', '17a', '17b', '17c', '17d', '17e', '19a', '19b', '19c', '19d', '19e']
    
  • 集合推导式(将列表推导式的[]变为{})

    set1 = {x*2 for x in 'hello'}
    print(set1)				# {'ll', 'ee', 'oo', 'hh'}
    
  • 元组推导式

    语法:

    tup = tuple(expression for variable in sequence)

    tup1 = tuple(x*2 for x in 'hello')
    print(tup1)				# ('hh', 'ee', 'll', 'll', 'oo')
    
  • 字典推导式

    语法:

    dic1 = {expression for variable in sequence}

    dic2 = dict(expression for variable in sequence)

    说明:

    如果序列是键值对形式存在直接把列表推导式的[]转换为{},即dic1

    如果不是则用dic2

    # 练习3:通过字典推导式交换一个字典的键和值
    dic1 = {'a': 10, 'b': 20, 'c': 30}
    new_dic1 = {dic1[key]: key for key in dic1}
    print(new_dic1)				# {10: 'a', 20: 'b', 30: 'c'}
    
    # 练习4:通过字典推导式交换一个字典的键和值,如果值是可变的在新的字典中不交换
    dic2 = {'a': 10, 'b': 20, 'c': 30, 'd': [10, 20]}
    new_dic2 = dict((key, dic2[key]) if type(dic2[key]) == list or type(dic2[key]) == dict or type(dic2[key]) == set else (dic2[key], key) for key in dic2)
    new_dic2 = dict((key, dic2[key]) if type(dic2[key]) in (list, dict, set) else (dic2[key], key) for key in dic2)
    print(new_dic2)				# {10: 'a', 20: 'b', 30: 'c', 'd': [10, 20]}
    

函数基础

没有函数时可能出现的问题:

1.相同功能对应的代码需要重新编写

2.一旦功能发生改变,需要将使用到这个功能的代码的位置全部修改

而函数可以简单的解决上述问题;因此,函数在编程中就显得至关重要了

  • 函数定义

    函数就是对实现某一特定功能的代码的封装

  • 函数分类

    从定义的角度分为:

    1.系统函数:对Python来说就是已经定义好,可以直接使用的函数;例如:print、type、chr、ord、id、max等

    2.自定义函数:由程序员自己定义,可以自己使用或给别人使用的函数

    还有含参函数和不含餐函数等等分类

  • 函数的使用

    • 定义函数

      语法:

      def Function name(Parameter list):
          Function documentation
          Function body
      

      说明:

      1.def - 关键字;固定写法

      2.Function name - 函数名:程序员自己命名;要求和规范同变量(标识符,不能是关键字;字母小写,单词用下划线隔开,见名知意(看到命名,得知功能),不使用系统的函数名、类型名和模块名)

      3.():- 固定写法

      4.Parameter list - 形参列表:以’variable1,variable2,variable3,……'的形式存在,每一个变量variable都是一个形参;用来将函数外部的数据传递到函数里面(如果实现函数的功能需要外部提供数据则需要形参)

      5.Function documentation - 函数说明文档:函数功能的说明;本质就是“”“”“”注释(必须是双引号)

      6.Function body - 函数体:与def保持一个缩进的一条或多条语句(至少一条),用来实现函数的功能

      注意:

      定义函数时不会执行函数体

      # 示例1:定义一个函数求任意两个数的和
      def summation(num1, num2):
          """
          求两个数的和 - 函数功能说明
          :param num1:提供第一个数字 - 参数说明
          :param num2:提供第二个数字 - 参数说明
          :return:None - 返回值 
          """
          print(num1 + num2)
      
      # 练习1:定义一个函数,求阶乘
      def factorial(num):
          """
          求数的阶乘
          :param num:提供数字
          :return:None
          """
          fac_num = 1
          for i in range(1, num + 1):
              fac_num *= i
          print(fac_num)
      
      
      # 练习2:将两个字符串交叉合并
      def merge(str1, str2):
          """
          交叉合并两个字符串
          :param str1:提供第一个字符串
          :param str2:提供第二个字符串
          :return:None
          """
          merge_str = ''
          str1_length = len(str1)
          str2_length = len(str2)
          # 交叉拼接相同长度的部分
          for i in range(min(str1_length, str2_length)):
              merge_str = merge_str + str1[i] + str2[i]
          # 确定尾部 
          if str1_length <= str2_length:
              merge_str = merge_str + str2[str1_length:]
          else:
              merge_str = merge_str + str1[str2_length:]
          print(merge_str)
      
    • 调用函数

      语法:

      Function name(List of arguments)
      

      说明:

      1.Function name - 需要使用的已经定义好的函数名

      2.()- 固定写法

      3.List of arguments - 实参列表:以’value1,value2,value3,……'的形式存在;实参就是需要从函数外部传递到函数内使用的具体数据(默认情况下形参有多少就有多少实参)

      factorial(5)
      merge('asdakfj', '12784')
      
  • 函数的参数

    根据实参的传递方式分为位置参数和关键字参数,其中,当两者混用时要保证位置参数在关键字参数前面

    • 位置参数

      语法:

      value1,value2,value3,……
      

      说明:

      让实参和形参一一对应
      
      def func1(a, b, c):
          print(f'a:{a}, b:{b}, c:{c}')
      
      func1(1, 2, 3)				# a:1, b:2, c:3
      
    • 关键字参数

      语法:

      Formal parameters1=Arguments1,Formal parameters2=Arguments2,……
      

      说明:

      可以打乱顺序
      
      def func1(a, b, c):
          print(f'a:{a}, b:{b}, c:{c}')
          
      func1(a=1, c=3, b=2)		# a:1, b:2, c:3
      
    • 另外说明 - 不定长参数

      定义参数时参数个数不确定,使用不定长参数

      a.带*的不定长参数 - 在形参前加使其变为不定长参数,可以同时接受多个实参;这个参数本质是一个元组,传递的实参会转换为这个元组中的元素

      b.带**的不定长参数 - 在形参前加使其变为不定长参数,可以同时接受多个实参;本质是一个字典(必须使用关键字参数传参)

      def func_a1(*num1):
          print(num1)
      func_a1()					# ()
      func_a1(1)					# (1,)
      func_a1(1, 2)				# (1, 2)
      func_a1(1, 2, 3, 4, 5, 6)	# (1, 2, 3, 4, 5, 6)
      
      def func_a2(*num2, a1):
          print(num2, 'a1:', a1)
      func_a2(a1=1)				# () a1: 1
      func_a2(2, 3, 4, 5, a1=1)	# (2, 3, 4, 5) a1: 1
      
      def func_a3(a2, *num3):
          print(num3, 'a2:', a2)
      func_a3(a2=1)				# () a2: 1
      func_a3(1, 2, 3, 4, 5)		# (2, 3, 4, 5) a2: 1
      
    • 注意:

      func(*args, **kwargs) 中*args, **kwargs的意义是让函数在调用时类型和数量更灵活,既可以不传参,也可以用位置参数,关键字参数,也可以混用

  • 默认参数值

    定义函数时可以直接给一个或多个形参赋默认值;有默认值的参数在调用时可以选择不传参

    没有默认值的参数必须在有默认值的参数前面

    def func2(b, a=2, c=3):
        print(f'a:{a}, b:{b}, c:{c}')
    
    
    def func3(b, a, c=3):
        print(f'a:{a}, b:{b}, c:{c}')
    
    func2(b=5)						# a:2, b:5, c:3
    func3(4,2)						# a:2, b:4, c:3
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值