美文网首页
2020-10-10推导式和函数及作业

2020-10-10推导式和函数及作业

作者: y_j杨健 | 来源:发表于2020-10-14 14:00 被阅读0次

    day9-推导式和函数及作业

    -- 列表 元祖 字典 集合 字符串
    表示方式: [元素1,元素2...] (元素1,元素2...)、(元素1,)、元素1,元素2... {键1:值1,键2:值2,...} {元素1,元素2...}、set() ''、""...
    容器特点: 可变,有序 不可变,无序 可变,无序 可变,无序 不可变,有序
    元素要求: 任何数据类型,可以重复 任何数据类型,可以重复 键:唯一并且不可变;值:任何数据类型 唯一不可变 有效的字符(普通字符、转义字符)
    元素的增删改查: 增:list.append(元素)、list.insert(下标,元素)、list.extend(序列) 删:del list[下标]、list.remove(元素)、list.pop(下标) 改:list[下标] = 值 查:list[下标]、切片、遍历 查:tuple[下标]、遍历 增:dict[key] = 新值、dict.setdefalut(键,值)、dict1.update(dict2) 删:del dict[key]、dict.pop(key)、dict.clear()、改: dict[key] =新值 查:dict[key]、dict.get() 增:set.add(元素)、set.update(序列) 删:set.remove(元素)、set.discard(元素) 查:下标、切片、遍历
    推导式
    推导式 基本结构
    列表推导式 [表达式 for 变量 in 序列];[表达式 for 变量 in序列 if 条件语句];[表达式 for 变量1 in 序列1 for 变量2 in 序列2] 产生一个新的列表,列表中的元素就是每次循环对应的表达式的值
    集合推导式 {表达式 for 变量 in 序列} 将列表推导式的 [ ] 变成 { }
    元祖推导式 tuple(表达式 for 变量 in 序列) 将列表推导式的 [ ] 变成 tuple()
    字典推导式 dict(表达式 for 变量 in 序列);{键:值 表达式 for 变量 in 序列} (表达式的有且只有两个元素的序列的时候)将列表推导式 [ ] 变成 dict();(表达式键值对形式)将列表推导式[ ] 变成 { }
    # 练习:写一个列表推导式,产生一个列表中的元素满足以下规律:str1,str3..str99
    # list6 = [f'str{x}' for x in range(1,100) if x == 1 or x % 3 == 0]
    list6 = ['str1' if x == 0 else f'str{x}' for x in range(0, 100, 3)]
    print(list6)  #  ['str0', 'str3', 'str6', 'str9', 'str12', 'str15', 'str18', 'str21', 'str24', 'str27', 'str30', 'str33', 'str36', 'str39', 'str42', 'str45', 'str48', 'str51', 'str54', 'str57', 'str60', 'str63', 'str66', 'str69', 'str72', 'str75', 'str78', 'str81', 'str84', 'str87', 'str90', 'str93', 'str96', 'str99']
    
    list4 = [x for x in range(10) if x % 2 == 0]
    print(list4)  # [0, 2, 4, 6, 8]
    
    list8 = [f'{x}{y}' for x in range(3) for y in 'abc']
    print(list8)  # ['0a', '0b', '0c', '1a', '1b', '1c', '2a', '2b', '2c']
    
    a1 = {x for x in 'hello'}
    print(a1)  # {'l', 'e', 'o', 'h'}
    
    a2 = tuple(x*2 for x in 'hello')
    print(a2)  # ('hh', 'ee', 'll', 'll', 'oo')
    
    a3 = {x:x*2 for x in 'hello'}
    print(a3)  # {'h': 'hh', 'e': 'ee', 'l': 'll', 'o': 'oo'}
    
    a4 = dict((x:x*2) for x in 'hello')
    print(a4)  # {'h': 'hh', 'e': 'ee', 'l': 'll', 'o': 'oo'}
    
    # 练习;通过字典推导式交换一个字典的键和值
    dic = {'a': 10, 'b': 20, 'c': 30}
    
    dict1 = dict((dic[x],x)for x in dic)
    print(dict1)  # {10: 'a', 20: 'b', 30: 'c'}
    
    # 练习;通过字典推导式交换一个字典的键和值,如果值是可变的再新的字典中不交换
    dic = {'a': 10, 'b': 20, 'c': 30, 'd': [10, 20]}
    dict3 = ((x,dic[x]) if type(idc[x]) in (list,set,dict) else (dic[x],x) for x in dic)
    print(dict3)  # {10: 'a', 20: 'b', 30: 'c', 'd': [10, 20]}
    
    函数的基础
    1. 认识函数

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

      函数的分类 --
      系统函数: python已经定义好,程序员直接使用函数,例如:print、input..
      自定义函数: 由程序员自己使用或者别人使用的函数
    2. 定义函数

      语法:
      def 函数名(形参列表):
       函数说明文档
          函数体
      
      说明 --
      def 关键字,固定写法
      函数名 程序员自己命名;要求:标识符,不能是关键字; 规范:字母小写单词之间用下划线隔开、见名知义、不能使用系统的函数名,类名和模块
      (): 固定写法
      形参列表 以 变量1,变量2,变量3... 的形式存在;形参的作用是将函数外部的数据传递到函数里面
      函数说明文档 说明书;本质就是用""""""引起来的注释
      函数体 和def保持一个缩进的一条或者多条语句
      注意: 定义函数的时候不会执行函数体
      # 定义一个函数求任意两个数字的和
      def sum1(num1,num2):
          """
          求两个数字的和 - (函数功能说明区)
          :param x:提供第一个数字
          :param y:提供第二个数字
          :return:None  -  返回值
          """
          print(num1+num2)
          
      # 定义一个函数将两个字符串交叉合并
      def str_merge(str1,str2):
          len1 = len(str1)
          len2 = len(str2)
          new_str = ''
          for index in range(min(len1,len2)):
              new_str += str1[index]+str2[index]
          if len1>len2:
              new_str += str1[len2:]
          else:
              new_str += str2[len1:]
      print(new_str)
      
    1. 调用函数

      """
      语法:
      函数名(实参列表)
      """
      
      说明 --
      函数名 需要使用的已经定义好的函数名
      () 固定写法
      实参列表 以 数据1,数据2....的形式存在;实参就是需要从函数外部传递到函数内部使用的具体数据
      # 定义一个函数求任意两个数字的和
      def sum1(num1,num2):
          """
          求两个数字的和 - (函数功能说明区)
          :param x:提供第一个数字
          :param y:提供第二个数字
          :return:None  -  返回值
          """
          print(num1+num2)
      
      # 调用函数
      sum1(5,6)
      
    函数的参数
    1. 位置参数和关键字参数

      --参数 --
      位置参数 以 实参1,实参2...形式存在,让实参和形参一一对应
      关键字参数 以 形参1=实参1,形参2=实参2...形式存在,这个参数的位置可以随意更改
      位置参数和关键字参数混用 位置参数必须在关键字参数的前面
      def func(a,b,c):
          print(f'a:{a},b:{b},c:{c}')
      
      # 位置参数
      func(10,20,30)  # a:10,b:20,c:30
      #关键字参数
      func(a=100,b=200,c=300)  # a:100,b:200,c:300
      func(b=200,c=300,a=100)  # a:100,b:200,c:300
      # 混用
      func(10,20,c=600)   # a:10,b:20,c:600
      
    2. 参数默认值

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

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

      def func2(a, b=1, c=2):
          print(f'a:{a},b:{b},c:{c}')
          
      func2(100) # a:100,b:1,c:2
      
    1. 不定长参数

      不定长参数 --
      带*的不定长参数 在形参前加*,让这个形参变成不定长参数,可以同时接收多个实参。这个参数的本质就是一个元祖;传递的对应的实参全部会变成这个元祖中的元素(必须使用位置参数传参)
      带**的不定长参数 在形参前加**,让这个形参变成不定长参数,可以同时接收多个实参。这个参数的本质就是一个字典(必须使用关键字参数传参)
      # 顶一个函数,求多个数的平均值
      def mean(*nums):
          if len(nums) == 0:
              print('0')
          else:
              print(f'平均值为:{sum(nums)/len(nums)}')
      
      mean(10,52,36,33)
      
      def func5(x,*a):
          print('a:',a,'x:',x)
      func5(10)  # a: () x: 10
      func5(10,52,63,2,0,1)  # a: (52, 63, 2, 0, 1) x: 10
      
      
      def func8(**num):
          print('num:',num)
      func8() # {}
      func8(a=100)  # num: {'a': 100}
      func8(name='张三',age=18)  # num: {'name': '张三', 'age': 18}
      
      # 面试题: func(*args,**kwargs), 函数func中 *args,**kwargs有什么意义
      # 调用的时候更加灵活
      def func(*args,**kwargs):
          pass
      func(10,20,30)
      func(a=10,b=2,c=63)
      func(2,52,3,2,52,a=10,b=2,c=63)
      
    作业
    1. 利用列表推导式, 完成以下需求:

      a. 生成一个存放1-100中各位数为3的数据列表:

      结果为 [3, 13, 23, 33, 43, 53, 63, 73, 83, 93]
      list1 = [num for num in range(3,100,10)]
      print(list1)  # [3, 13, 23, 33, 43, 53, 63, 73, 83, 93]
      

    b. 利用列表推到是将 列表中的整数提取出来:

    例如:[True, 17, "hello", "bye", 98, 34, 21] --- [17, 98, 34, 21]
    
    list2 = [True, 17, "hello", "bye", 98, 34, 21]
    list3 = [x for x in list2 if type(x) ==  int]
    print(list3)  # [17, 98, 34, 21]
    

    c. 利用列表推导式 存放指定列表中字符串的长度:

    例如 ["good", "nice", "see you", "bye"] --- [4, 4, 7, 3]
    
    str1 = ["good", "nice", "see you", "bye"]
    list4 = [len(x) for x in str1]
    print(list4)  # [4, 4, 7, 3]
    

    d. dict_list = [{“科目”:“政治”, “成绩”:98}, {“科目”:“语文”, “成绩”:77}, {“科目”:“数学”, “成绩”:99}, {“科目”:“历史”, “成绩”:65}]

    去除列表中成绩小于70的字典 【列表推导式完成】

    结果为: [{“科目”:“政治”, “成绩”:98}, {“科目”:“语文”, “成绩”:77}, {“科目”:“数学”, “成绩”:99}]
    
    dict_list = [{'科目':'政治', '成绩':98}, {'科目':'语文', '成绩':77}, {'科目':'数学', '成绩':99}, {'科目':'历史', '成绩':65}]
    dict_list = [x for x in dict_list if x['成绩'] >= 70]
    print(dict_list)  # [{'科目': '政治', '成绩': 98}, {'科目': '语文', '成绩': 77}, {'科目': '数学', '成绩': 99}]
    
    1. 编写函数,求1+2+3+…N的和

      def sum1(n):
          """
          求1+2+3+…N的和
          :param n:
          :return:
          """
          sum = 0
          for i in range(n + 1):
              sum += i
          print(sum)
      sum1(100) # 5050 
      
    1. 编写一个函数,求多个数中的最大值

      def max1(*num):
          """
          求多个数中的最大值
          :param num: 
          :return: 
          """
          if len(num) == 0:
              print('0')
          print(max(num))
      max1(10,52,63,65,9,86,10,0)
      
    1. 编写一个函数,实现摇骰子的功能,打印N个骰子的点数和

      import random
      def sum2(n):
          """
          实现摇骰子的功能,打印N个骰子的点数和
          :param n: 
          :return:
          """
          i = 0
          sum = 0
          while i < n:
              sum += random.randint(1,6)
              i += 1
          print(sum)
      
      sum2(5)
      
    1. 编写一个函数,交换指定字典的key和value。
    例如:dict1={'a':1, 'b':2, 'c':3}  -->  dict1={1:'a', 2:'b', 3:'c'}  
          
    def swap(dict1):
      """
      交换指定字典的key和value。
      :param dict1: 提供字典
      :return: 
      """
      dict2 = dict((x,dict1[x]) if dict1[x] in (list,set,dict) else (dict1[x],x) for x in dict1)
      print(dict2)
    
    dict1={'a':1, 'b':2, 'c':3}
    swap(dict1)  # {1: 'a', 2: 'b', 3: 'c'}
    
    1. 编写一个函数,提取指定字符串中所有的字母,然后拼接在一起产生一个新的字符串

      例如: 传入'12a&bc12d-+'   -->  'abcd'  
      def joint_str(str1):
          """
          提取指定字符串中所有的字母,然后拼接在一起产生一个新的字符串
          :param str1:
          :return:
          """
          new_str = ''
          for c in str1:
              if 'a' <= c <= 'z' or 'A' <= c <= 'Z':
                  new_str += c
          print(new_str)
      
      str1 = '12a&bc12d-+'
      joint_str(str1)  # abcd
      
    1. 写一个函数,求多个数的平均值

      def mean(*num):
           """
          求多个数的平均值
          :param num:提供多个数
          :return:
          """
          if len(num) == 0:
              print('0')
          else:
              print(f'平均值为:{sum(num) / len(num)}')
      
      mean(10,20,30) #  平均值为:20.0
      
    1. 写一个函数,默认求10的阶乘,也可以求其他数字的阶乘

      def factorial(n=10):
           """
          默认求10的阶乘,也可以求其他数字的阶乘
          :param n: 提供任意数字
          :return:
          """
          num = 1
          for i in range(1,n+1):
           num *= i
          print(num)
      
      factorial()  # 3628800
      
       
       
       
         
       
       
    
    =====================注意:以下方法不能使用系统提供的方法和函数,全部自己写逻辑==============
    
    8. 写一个自己的capitalize函数,能够将指定字符串的首字母变成大写字母
    
       ```python
       例如: 'abc' -> 'Abc'   '12asd'  --> '12asd'
       def capitalize1(str1):
            """
           写一个自己的capitalize函数,能够将指定字符串的首字母变成大写字母
           :param str1:
           :return: 
           """
           new_str = ''
           if 'a' <= str1[0] <= 'z':
               new_str += chr(ord(str1[0])-32)
               for i in str1[1:]:
                   new_str += i
           else:
               for x in str1:
                   new_str += x
           print(new_str)
           
       capitalize1('123abc') # 123abc
       capitalize1('Aabc') # Aabc
       capitalize1('abc') # Abc
    
    1. 写一个自己的endswith函数,判断一个字符串是否已指定的字符串结束

      例如: 字符串1:'abc231ab' 字符串2:'ab' 函数结果为: True
           字符串1:'abc231ab' 字符串2:'ab1' 函数结果为: False
      def endswith1(str1,str2):
          """
          判断一个字符串是否已指定的字符串结束
          :param str1:
          :param str2:
          :return:
          """
          len2 = len(str2)
          if str2 == str1[-len2:]:
              print(True)
          else:
              print(False)
      
      str1 = 'abc231ab'
      str2 = 'ab'
      endswith1(str1,str2)  # True
      
    1. 写一个自己的isdigit函数,判断一个字符串是否是纯数字字符串
    例如: '1234921'  结果: True
          '23函数'   结果: False
          'a2390'    结果: False
    def isdigit1(str1):
     """
     判断一个字符串是否是纯数字字符串
     :param str1: 提供字符串
     :return:
     """
     count = 0
     for c in str1:
         if '0' <= c <= '9':
             count += 1
         else:
             break
     if count == len(str1):
         print(True)
     else:
         print(False)
    
    str1 = '1234921'
    isdigit1(str1)  # True
    
    1. 写一个自己的upper函数,将一个字符串中所有的小写字母变成大写字母

      例如: 'abH23好rp1'   结果: 'ABH23好RP1'  
      def upper1(str1):
          """
          将一个字符串中所有的小写字母变成大写字母
          :param str1:
          :return:
          """
          new_str = ''
          for c in str1:
              if 'a' <= c <= 'z':
                  new_str += chr(ord(c)-32)
              else:
                  new_str += c
          print(new_str)
      
      str1 = 'abH23好rp1'
      upper1(str1)  # ABH23好RP1
      
    2. 写一个自己的rjust函数,创建一个字符串的长度是指定长度,原字符串在新字符串中右对齐,剩下的部分用指定的字符填充

    例如: 原字符:'abc'  宽度: 7  字符:'^'    结果: '^^^^abc'
         原字符:'你好吗'  宽度: 5  字符:'0'    结果: '00你好吗'
    def rjust1(str1,a):
     """
     创建一个字符串的长度是指定长度,原字符串在新字符串中右对齐,剩下的部分用指定的字符填充
     :param str1: 
     :param a: 
     :return: 
     """
     new_str = f'{str1:{a}>5}'
     # print(f'{str1:age>5}')
     # new_str = str1.zfill(5)
     # print(new_str)
     print(new_str)
    
    str1 = '你好吗'
    rjust1(str1,'/')  # //你好吗
    
    1. 写一个自己的index函数,统计指定列表中指定元素的所有下标,如果列表中没有指定元素返回-1

      例如: 列表: [1, 2, 45, 'abc', 1, '你好', 1, 0]  元素: 1   结果: 0,4,6  
           列表: ['赵云', '郭嘉', '诸葛亮', '曹操', '赵云', '孙权']  元素: '赵云'   结果: 0,4
           列表: ['赵云', '郭嘉', '诸葛亮', '曹操', '赵云', '孙权']  元素: '关羽'   结果: -1      
      def index1(list1,element):
          """
          统计指定列表中指定元素的所有下标,如果列表中没有指定元素返回-1
          :param list1:
          :return:
          """
          result = []
          count = 0
          for index in range(len(list1)):
              if list1[index] == element:
                  count += 1
                  result.append(index)
          if count == 0:
              print('-1')
          else:
              print(result)
      
      list1 =  [1, 2, 45, 'abc', 1, '你好', 1, 0]
      list2 = ['赵云', '郭嘉', '诸葛亮', '曹操', '赵云', '孙权']
      list3 = ['赵云', '郭嘉', '诸葛亮', '曹操', '赵云', '孙权']
      index1(list1,1)  # [0, 4, 6]
      index1(list2,'赵云')   # [0, 4]
      index1(list3,'关羽')   # -1
      
    1. 写一个自己的len函数,统计指定序列中元素的个数

      例如: 序列:[1, 3, 5, 6]    结果: 4
           序列:(1, 34, 'a', 45, 'bbb')  结果: 5  
           序列:'hello w'    结果: 7
      def len1(sequence):
          """
          统计指定序列中元素的个数
          :param sequence: 提供一个序列
          :return: 
          """
          count = 0
          for i in sequence:
              count += 1
          print(f'传入序列的中的个数为:',count)
      
      list1 = [1, 3, 5, 6]
      tuple1 = (1, 34, 'a', 45, 'bbb')
      str1 = 'hello w'
      len1(list1)  # 传入序列的中的个数为: 4
      len1(tuple1)  # 传入序列的中的个数为: 5
      len1(str1)  # 传入序列的中的个数为: 7
      
      
    1. 写一个自己的max函数,获取指定序列中元素的最大值。如果序列是字典,取字典值的最大值

      例如: 序列:[-7, -12, -1, -9]    结果: -1   
           序列:'abcdpzasdz'    结果: 'z'  
           序列:{'小明':90, '张三': 76, '路飞':30, '小花': 98}   结果: 98
      def max1(sequence):
          """
          获取指定序列中元素的最大值。如果序列是字典,取字典值的最大值
          :param sequence:
          :return:
          """
          if type(sequence) in (list,str,dict):
              if type(sequence) == list:
                  n = sequence[0]
                  for index in range(len(sequence)-1):
                      if sequence[index+1] >n:
                          n = sequence[index+1]
                  print(n)
              elif type(sequence) == str:
                  m = sequence[0]
                  for i in range(len(sequence)-1):
                      if sequence[i+1] > m:
                          m = sequence[i+1]
                  print(m)
              elif type(sequence) == dict:
                  dic_max = sequence['小明']
                  for d in sequence:
                      if sequence[d] > dic_max:
                          dic_max = sequence[d]
                  print(dic_max)
          else:
              print(f'传入序列不是list/str/dict类型')
      
      max1([-7, -12, -1, -9])  # -1
      max1('abcdpzasdz') # 'z'
      max1({'小明':90, '张三': 76, '路飞':30, '小花': 98})  # 98
      max1((52,5,3,5))  # 传入序列不是list/str/dict类型
      
    1. 写一个函数实现自己in操作,判断指定序列中,指定的元素是否存在

      例如: 序列: (12, 90, 'abc')   元素: '90'     结果: False
           序列: [12, 90, 'abc']   元素: 90     结果: True     
      def fl_in(sequence,element):
          """
          判断指定序列中,指定的元素是否存在
          :param sequence: 
          :param element:
          :return:
          """
          flag = True
          for i in sequence:
              if i == element:
                  flag = True
                  break
          else:
              flag = False
          print(flag)
      
      list1 = [12, 90, 'abc']
      tuple1 = (12, 90, 'abc')
      fl_in(list1,90)  # True
      fl_in(tuple1,'90')  # False
      
    1. 写一个自己的replace函数,将指定字符串中指定的旧字符串转换成指定的新字符串

      例如: 原字符串: 'how are you? and you?'   旧字符串: 'you'  新字符串:'me'  结果: 'how are me? and me?'
      def fl_replace(str1,old_str,new_str):
      """
          将指定字符串中指定的旧字符串转换成指定的新字符串
      :param str1: 
          :param old_str: 
          :param new_str: 
          :return: 
          """
          len1 = len(str1)
          len2 = len(old_str)
          string1 = ''
          string2 = ''
          while old_str in str1:
              for i in range(len1-len2+1):
                  if str1[i:i+len2] == old_str:
                      string1 = str1[:i]
                      string2 = str1[i+len2:]
                      break
              str1 = (string1+new_str+string2)
          print(str1)
      
      fl_replace('how are you? and you?','you','me')# how are me? and me?
      

    相关文章

      网友评论

          本文标题:2020-10-10推导式和函数及作业

          本文链接:https://www.haomeiwen.com/subject/cpfwpktx.html