暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python3.9笔记1

一生求阙 2022-10-03
464
在学一门编程语言的过程中,我的方法是先看一遍视频建立一定的认知,同时对着官方文档理解重难点,在过程中做题实践总结。

                                        数据类型中常用函数及方法



按照有序无序、可变不可变对数据类型分类:
  • 有序:可以通过下标索引访问元素
  • 无序:不可以通过下标索引访问元素
  • 可变:可以被修改
  • 不可变:不可以被修改

有序
无序
可变
列表list
字典dict、集合set
不可变
字符串str、元组tuple
数值int、float、bool、complex(x + yj)
print()
end参数,规定输出的内容以什么结尾,不写这个参数的时候那么默认是以换行符结尾,如果需要以其他的字符结尾那么使用print(....., end="其他的字符")即可;
sep参数,用来设置输出的多个对象之间连接的符号,一般在print语句中会输出多个参数,这些参数会使用逗号进行隔开,sep属性不写的话默认是按照空格连接。
    str1 = 'Hello World!'
    str2 = 'Hello Nowcoder!'
    print(str1,str2,sep='\n')
    输出: 
    Hello World!
    Hello Nowcoder!
    想要输出原始字符串,可以在前面加上 r 
      print(r'\nmenkim is me') #\nmenkim is me
      name = r'\nmenkim is me'
      print(name) #\nmenkim is me
      print('\nmenkim is me'#会先换行然后输出menkim is me

      str.isnumeric()
      如果字符串中至少有一个字符且所有字符均为数值字符则返回 True ,否则返回 False 。
        print('0.343'.isnumeric()) #False
        print('1'.isnumeric()) #True
        str.isdigit()

        如果字符串中的所有字符都是数字,并且至少有一个字符,返回 True ,否则返回 False 。数字包括十进制字符和需要特殊处理的数字,如兼容性上标数字。这包括了不能用来组成 10 进制数的数字,如 Kharosthi 数。 

          #实现输入整数,输出内容和并转化为int类型
          num = input()
          if num.isdigit():
          a = int(num)
          print(a,type(a),sep="\n")
          else:
          print("非数字")
          格式化输出案例:
            name = input()
            print("I am %s and I am studying Python in Nowcoder!" %name)
            # print(f"I am {name} and I am studying Python in Nowcoder!")
            # print("I am {} and I am studying Python in Nowcoder!".format(name))
            int(x,base=10)
            返回一个基于数字(包括整数或浮点数)字符串 x (必须为整数)构造的整数对象,或者在未给出参数时返回 0
            如果有base输入,则x必须为字符串,可以将2-36进制转换为10进制
              int() #输出0
              int(23.6) #浮点数向下取整,23,默认10进制
              int(23) #输入整数时,默认10进制
              int('0xa',16)
              #如果有base输入,且x以字符串形式输入,
              #代表x为base进制,则按照输入的base将x转换为10进制输出
              输出:10
              int('10',8) #将8进制转化为10进制
              输出:8
              一种将十六进制转换为十进制的算法:
                #将十六进制整数ABCDEF,转换为十进制整数
                dic = {'A':10,'B':11,'C':12,'D':13,'E':14,'F':15}
                n = 0
                m = 'ABCDEF'
                l = len(m)
                for i in m:
                n = n + dic[i]*16**(l-1)
                l = l - 1
                print("%15d" % n)
                将十进制数转换为其他进制数的方法,采用短除法:
                如十进制120 —> 六进制
                120/6=20 ----余0
                20/6=3 ----余2
                3/6=0 ----余3 (注:循环下去,直到商为0)
                很明显所对应的六进制数为320
                  n = int(input()) #输入120
                  m = ''
                  while n != 0:
                  m += str(n%6) #将余数拼接
                  n = n//6
                  print(m[::-1]) #将得到的数转制
                  str.encode(encoding="utf-8",errors="strict")
                  返回原字符串编码为字节串对象的版本。默认编码为 'utf-8'
                  str.isalpha()
                  如果字符串中的所有字符都是字母,并且至少有一个字符,返回 True
                   ,否则返回 False
                   。字母字符是指那些在 Unicode 字符数据库中定义为 "Letter" 的字符,即那些具有 "Lm"、"Lt"、"Lu"、"Ll" 或 "Lo" 之一的通用类别属性的字符。
                  str.isalnum()
                  如果字符串中的所有字符都是字母或数字且至少有一个字符,则返回 True
                   , 否则返回 False
                   。
                    str1 = input()
                    if str1.encode('utf8').isalpha(): #判断字符串是否均为字母
                    print(len(str1))
                    else:
                    print("请重新输入")
                    str.title()
                    返回每个单词第一个字母为大写,其余字母为小写的字符串
                      str1 = "hello world"
                      str1.title()
                      输出:'Hello World'

                      该算法使用一种简单的与语言无关的定义,将连续的字母组合视为单词。该定义在多数情况下都很有效,但它也意味着代表缩写形式与所有格的撇号也会成为单词边界,这可能导致不希望的结果:
                        "they're bill's friends from the UK".title()
                        输出:"They'Re Bill'S Friends From The Uk"


                        官方文档提供了一种方法消除此影响:
                          import re
                          def titlecase(s):
                          return re.sub(r"[A-Za-z]+('[A-Za-z]+)?",
                          lambda mo: mo.group(0).capitalize(),
                          s)


                          titlecase("they're bill's friends.")
                          输出:"They're Bill's Friends."

                          str.capitalize()
                          返回原字符串的副本,其首个字符大写,其余为小写,如果首字符不是字母,则不会大写,但转化为小写依然生效
                            " hEllo world".capitalize() #输出 ' hello world'
                            "hEllo world".capitalize() #输出 'Hello world'
                            "hello world".capitalize() #输出 'Hello world'

                            str.strip()
                            返回原字符串的副本,移除其中的前导和末尾字符。 chars 参数为指定要移除字符的字符串。如果省略或为 None
                            ,则 chars 参数默认移除空白符
                            。实际上 chars 参数并非指定单个前缀或后缀;而是会移除参数值的所有组合:
                              'www.example.com'.strip('cmowz.')
                              输出:'example'

                              对应还有str.lstrip() 移除其中的前导字符;str.rstrip() 移除其中的末尾字符。
                              索引切片:str[start : end : step]
                              • str:要截取的字符串;

                              • start:表示要截取的第一个字符所在的索引(截取时包含该字符)。如果不指定,默认为 0,也就是从字符串的开头截取;

                              • end:表示要截取的最后一个字符所在的索引(截取时不包含该字符)。如果不指定,默认为字符串的长度;

                              • step:指的是从 start 索引处的字符开始,每 step 个距离获取一个字符,直至 end 索引出的字符。step 默认值为 1,当省略该值时,最后一个冒号也可以省略。

                              • 特殊用法:当step为负数,start和end没有指定时,默认从序列右边向左按步幅切片

                                a = "Hello"
                                print(a[:4]) 
                                输出:'Hell'
                                  c = '123'
                                  print(c[2::-1]) #等同于c[::-1]
                                  print(c[::-1])
                                  输出:
                                  321
                                  321
                                  sorted(iterable, /, *, key=None, reverse=False) 
                                  可用于任何可迭代对象的排序,会返回一个新的已排序列表,默认是生序
                                  list.sort(*, key=None, reverse=False) 
                                  只能作用于列表,直接修改原列表,默认是升序
                                  list.reverse()
                                  只能作用于列表,直接修改原列表,将列表中的元素进行逆置
                                    sorted([5, 2, 3, 1, 4])
                                    输出:[1, 2, 3, 4, 5]
                                      a = [5, 2, 3, 1, 4]
                                      a.sort()
                                      a #输出:[1, 2, 3, 4, 5]
                                        a = [5, 2, 3, 1, 4]
                                        a.reverse()
                                        a   #输出:[4, 1, 3, 2, 5]

                                        reversed(seq)

                                        返回一个反向的 iterator。seq 必须是一个具有 __reversed__() 方法的对象或者是支持该序列协议(具有从 0 开始的整数类型参数的 __len__() 方法和 __getitem__() 方法)

                                          a=''.join(list(reversed('1234')))
                                          print(a) 
                                          输出:
                                          4321


                                          字符串转制的一种方法:
                                            '1234'[::-1]  #输出'4321'
                                            eval(expression[, globals[, locals]]),用于输出表达式的值
                                            • expression为字符串表达式,可以将字符串转化为其他的类型,list,dict,set,int,tuple等

                                            • globals为全局变量作用域,必须为字典,当表达式中的变量在globals中存在时,会忽略外部变量,使用该变量的值

                                            • locals为本地变量作用域,可以为任意映射对象,当表达式中的变量在locals中存在时,会忽略外部和globals中相同变量,使用该变量的值

                                              a = "{1,2,3,4}"
                                              b = eval(a)
                                              print(b,type(b))
                                              输出:{1, 2, 3, 4} <class 'set'> #其他同理
                                                a = 12
                                                print(eval('a+1'))
                                                输出:13
                                                  a = 12
                                                  g = {'a':4}
                                                  print(eval('a+1',g))
                                                  输出:5
                                                    a = 12
                                                    b = 11
                                                    c = 10
                                                    g = {'a':4,'b':3}
                                                    l = {'b':2,'c':1}
                                                    print(eval('a+b+c',g,l))
                                                    输出:7

                                                    map(function,iterable,...) 高阶函数

                                                    接受函数和可迭代对象,将函数作用于每个可迭代对象中的元素,得到一个迭代器,可用不同的数据类型接收值:

                                                      x,y = map(int,('2','3'))
                                                      print(x,y,type(x),type(y))
                                                      输出:2 3 <class 'int'> <class 'int'>
                                                        r = map(lambda x:x*2,(2,3))
                                                        list(r)
                                                        输出:[4, 6]

                                                        隐式判断:

                                                        False:0、[ ]、{}、()、""、None

                                                        True:除False以外的任意对象

                                                        逻辑运算符:与and、或or、非not

                                                        • A  and  B :如果A为False,返回A,否则返回B的值

                                                        • A  or  B :如果A为True,返回A,否则返回B的值

                                                        • not A :如果A为True,返回False,否则返回True

                                                          0 and 2 #0
                                                          1 and 2 #2
                                                          1 and 0 #0
                                                          0 or 2 #2
                                                          1 or 2 #1
                                                          not 1 #False
                                                          not 0 #True


                                                          位运算符:

                                                          将数字看成二进制,直接对二进制数字的每一位进行运算,返回十进制结果

                                                          & :位与运算符,按参与运算的两个值,如果相应位的值都为1,则该位的结果为1

                                                          • |:位或运算符,如果相应位的值有一个为1,则该位的结果为1

                                                          • ^ :位异或运算符,如果相应位的值相异时,则该位的结果为1

                                                          • ~ :位取反运算符,把数据的二进制位取反,即把1变为0,把0变为1

                                                          • << :左移动运算符,运算数的各二进位全部左移若干位,由<< 右边的数指定移动的位数,高位丢弃,低位补0

                                                          • >> :右移动运算符,把>> 左边的运算数各二进位全部右移若干位,>> 右边的数指定移动的位数

                                                          sum(iterable, /, start=0)

                                                          从 start 开始自左向右对 iterable 的项求和并返回总计值。iterable 的项通常为数字,而 start 值则不允许为字符串

                                                            dt = {"A":4,"B":3,"C":2,"D":1,"F":0}
                                                            list1 = []
                                                            list2 = []


                                                            while True:
                                                            s = input()
                                                            if s == "False":
                                                            break
                                                            else:
                                                            s1 = int(input())
                                                            list1.append(dt[s] * s1)
                                                            list2.append(s1)


                                                            print('%.2f'%(sum(list1)/sum(list2)))

                                                            round(number[, ndigits])

                                                            返回 number 舍入到小数点后 ndigits 位精度的值。如果 ndigits 被省略或为 None,则返回最接近输入值的整数。

                                                            对于支持 round() 的内置类型,值会被舍入到最接近的 10 的负 ndigits 次幂的倍数;如果与两个倍数的距离相等,则选择偶数 (因此,round(0.5) 和 round(-0.5) 均为 0 而 round(1.5) 为 2)。

                                                              round(5.5) #6
                                                              round(4.5#4
                                                              round(3.2,2) #3.2
                                                              round(6.675,2) #6.67
                                                              round(6.575,2) #6.58
                                                              #两者舍入不同的原因是由于大多数十进制小数实际上都不能以浮点数精确地表示。

                                                              确保四舍五入精度严格的一种方法:

                                                              Decimal(value="0", context=None)

                                                              value 可以是整数,字符串,元组,float ,或另一个 Decimal 对象。如果没有给出 value,则返回 Decimal('0')。

                                                                from decimal import Decimal
                                                                a = Decimal('23.3456').quantize(Decimal('0.01'),rounding='ROUND_HALF_UP')
                                                                print(a)  #23.35
                                                                b = Decimal('7.325').quantize(Decimal('1.'), rounding='ROUND_HALF_UP')
                                                                print(b) #7


                                                                tuple([iterable])   列表同理list([iterable])

                                                                可以用多种方式构建元组:

                                                                • 使用一对圆括号来表示空元组: ()

                                                                • 使用一个后缀的逗号来表示单元组: a, 或 (a,)

                                                                • 使用以逗号分隔的多个项: a, b, c or (a, b, c)

                                                                • 使用内置的tuple() 或 tuple(iterable)

                                                                构造器将构造一个元组,其中的项与 iterable 中的项具有相同的值与顺序。iterable 可以是序列、支持迭代的容器或其他可迭代对象。如果 iterable 已经是一个元组,会不加改变地将其返回。例如,tuple('abc') 返回 ('a', 'b', 'c') 而 tuple( [1, 2, 3] ) 返回 (1, 2, 3)。如果没有给出参数,构造器将创建一个空元组 ()。


                                                                细节点记录:

                                                                  df = [[1,2,3],[4,5,6],[7,8,9]]
                                                                  for x,y,z in df[0],df[1],df[2]:
                                                                  print(x,y,z)
                                                                  输出:
                                                                  1 2 3
                                                                  4 5 6
                                                                  7 8 9
                                                                  #此处会把df[0],df[1],df[2]当作一个元组,
                                                                  #然后将每一项的三个值分别赋给x,y,z

                                                                  zip(*iterables)

                                                                  创建一个聚合了来自每个可迭代对象中的元素的迭代器。

                                                                  返回一个元组的迭代器,其中的第 i 个元组包含来自每个参数序列或可迭代对象的第 i 个元素。当所输入可迭代对象中最短的一个被耗尽时,迭代器将停止迭代。当只有一个可迭代对象参数时,它将返回一个单元组的迭代器。不带参数时,它将返回一个空迭代器

                                                                    a = [1,2,3]
                                                                    b = zip(a)
                                                                    list(b)
                                                                    输出:[(1,), (2,), (3,)]
                                                                      a = [1,2,3]
                                                                      b = [4,5,6,7]
                                                                      c = zip(a,b)
                                                                      # dict(c) #{1: 4, 2: 5, 3: 6}
                                                                      # list(c) #[(1, 4), (2, 5), (3, 6)]
                                                                      # tuple(c) #((1, 4), (2, 5), (3, 6))
                                                                      x,y = zip(*zip(a,b))
                                                                      # list(x) #[1, 2, 3]
                                                                      list(y) #[4, 5, 6]

                                                                      zip()
                                                                       与 *
                                                                       运算符相结合可以用来拆解一个列表

                                                                      count(sub[, start[, end]]) #列表可用

                                                                      返回子字符串 sub 在 [start, end] 范围内出现的次数。可选参数 start 与 end 会被解读为切片表示法。

                                                                        var = input()
                                                                        var_dict = {}
                                                                        for i in var:
                                                                        var_dict[i] = var.count(i)
                                                                        print(var_dict)

                                                                        abs(x)

                                                                        返回一个数的绝对值。参数可以是整数、浮点数或任何实现了 __abs__() 的对象。如果参数是一个复数,则返回它的模

                                                                        max(iterable, *[, key, default])  #min() 同理返回最小元素

                                                                        max(arg1, arg2, *args[, key])  #min() 同理返回最小元素

                                                                        返回可迭代对象中最大的元素,或者返回两个及以上实参中最大的。

                                                                        如果只提供了一个位置参数,它必须是非空 iterable ,返回可迭代对象中最大的元素;如果提供了两个及以上的位置参数,则返回最大的位置参数。

                                                                        有两个可选只能用关键字的实参。key 实参指定排序函数用的参数,如传给 list.sort() 的。default 实参是当可迭代对象为空时返回的值。如果可迭代对象为空,并且没有给 default ,则会触发ValueError。

                                                                        如果有多个最大元素,则此函数将返回第一个找到的

                                                                          num_list = list(map(int,input().split()))
                                                                          print(max(num_list),min(num_list),sep='\n')


                                                                          ord(c)

                                                                          对表示单个 Unicode 字符的字符串,返回代表它 Unicode 码点的整数(ASCII码)。例如 ord('a') 返回整数 97, ord('€') (欧元符号)返回 8364 。这是 chr() 的逆函数,chr(97)
                                                                           返回字符串 'a'


                                                                          hex(x)

                                                                          将整数转换为以“0x”为前缀的小写十六进制字符串。x 为 int 对象。

                                                                          如果想要去除带前缀的"0x" 或者将十六进制字符串大写,可以采用格式化输出,还有format()或者加 " f " 

                                                                            '%x'%234 ,'%#x'%234 ,'%#X'%234 ,'%X'%234 
                                                                            #('ea', '0xea', '0XEA', 'EA')

                                                                            float.hex()

                                                                            将浮点数转化为以"0x"为前缀和尾随"p"加指数的十六进制字符串

                                                                              print((12.23).hex()) #0x1.875c28f5c28f6p+3

                                                                              oct(x)

                                                                              将整数转换为以"0o"为前缀的八进制字符串。x 为 int 对象。

                                                                              如果想要去除带前缀的"0o" ,可以采用格式化输出

                                                                                 '%#o' % 10, '%o' % 10 #('0o12', '12')


                                                                                format(10, '#o'), format(10, 'o') #('0o12', '12')


                                                                                f'{10:#o}', f'{10:o}' #('0o12', '12')

                                                                                bin(x)

                                                                                将整数转化为一个前缀为“0b”的二进制字符串。x 为 int 对象

                                                                                  bin(3) #输出'0b11'


                                                                                  str.find(sub[, start[, end]])

                                                                                  返回子字符串 sub 在 s[start:end] 切片内被找到的最小索引(指的是按str排的索引)。可选参数 start 与 end 会被解读为切片表示法。如果 sub 未被找到则返回 -1。

                                                                                    var = 'NiuNiu won the prize!'
                                                                                    print(var.find('the',9)) #11

                                                                                    str.join(iterable)

                                                                                    将iterable中的字符串按指定的str字符串拼接成新字符串,iterable中不能包含非字符串值,否则报错TypeError

                                                                                      s = input()
                                                                                      n = []
                                                                                      # while True:  #一种方法
                                                                                      # if s == '0':
                                                                                      # break
                                                                                      # else:
                                                                                      # n.append(s)
                                                                                      # s = input()
                                                                                      # print(' '.join(n))
                                                                                      while s != '0': #第二种方法
                                                                                      n.append(s)
                                                                                      s = input()
                                                                                      print(' '.join(n))

                                                                                      hasattr(object, name)

                                                                                      该实参是一个对象和一个字符串。如果字符串是对象的属性之一的名称,则返回 True,否则返回 False。(此功能是通过调用 getattr(object, name) 看是否有 AttributeError 异常来实现的。)

                                                                                      setattr(object, name, value)

                                                                                      此函数与 getattr() 两相对应。其参数为一个对象、一个字符串和一个任意值。字符串指定一个现有属性或者新增属性。函数会将值赋给该属性,只要对象允许这种操作。例如,setattr(x, 'foobar', 123) 等价于 x.foobar = 123。

                                                                                        class Employee():
                                                                                        def __init__(self,name,salary):
                                                                                        self.name = name
                                                                                        self.salary = salary


                                                                                        def printclass(self):
                                                                                        print(f"{self.name}'salary is {self.salary}, and his age is {self.age}")


                                                                                        name = input()
                                                                                        salary = int(input())
                                                                                        age = int(input())
                                                                                        e = Employee(name,salary)
                                                                                        print(hasattr(e,'age')) 
                                                                                        #判断e对象是否有为age的属性,有返回True,否则False
                                                                                        setattr(e,'age',age) 
                                                                                        #为e对象添加名为age的属性及其对应的值
                                                                                        e.printclass()

                                                                                        enumerate(iterable, start=0)

                                                                                        返回一个枚举对象。iterable 必须是一个序列,或 iterator,或其他支持迭代的对象。enumerate() 返回的迭代器的 __next__() 方法返回一个元组,里面包含一个计数值(从 start 开始,默认为 0)和通过迭代 iterable 获得的值。

                                                                                          seasons = ['Spring', 'Summer', 'Fall', 'Winter']
                                                                                          print(list(enumerate(seasons)))
                                                                                          print(list(enumerate(seasons,1)))
                                                                                          输出:
                                                                                          [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
                                                                                          [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]


                                                                                          seasons = ['Spring', 'Summer', 'Fall', 'Winter']
                                                                                          for index,value in enumerate(seasons,1):#索引从1开始计数
                                                                                          print(index,value)
                                                                                          输出:
                                                                                          1 Spring
                                                                                          2 Summer
                                                                                          3 Fall
                                                                                          4 Winter

                                                                                                                                         

                                                                                                                                           条件判断语句和循环语句



                                                                                          条件语句:

                                                                                            if 条件语句1:
                                                                                                语句块1 #条件为真时执行
                                                                                            elif 条件语句2:
                                                                                                语句块2 #条件为真时执行
                                                                                            else
                                                                                                语句块3 #条件为假时执行

                                                                                            continue:

                                                                                            跳过当前循环的剩余语句,继续执行下一个循环

                                                                                              n = 0
                                                                                              while n < 5:
                                                                                              n += 1
                                                                                              if n == 3:
                                                                                              continue
                                                                                                  print('I am wrong %d'%n)
                                                                                              else:
                                                                                                  print(n)
                                                                                              输出:
                                                                                              I am wrong 1
                                                                                              I am wrong 2
                                                                                              I am wrong 4
                                                                                              I am wrong 5
                                                                                              5

                                                                                              break:

                                                                                              结束当前的整个循环,循环对应的else也不会执行

                                                                                                n = 0
                                                                                                while n < 5:
                                                                                                n += 1
                                                                                                if n == 2:
                                                                                                continue
                                                                                                if n == 4:
                                                                                                break
                                                                                                print('I am wrong %d'%n)
                                                                                                else:
                                                                                                    print(n)
                                                                                                输出:
                                                                                                I am wrong 1
                                                                                                I am wrong 3

                                                                                                循环语句:一般不建议写else语句

                                                                                                  for iter in iters:#接收可迭代对象作为参数,每次迭代其中的一个元素
                                                                                                  循环语句块
                                                                                                  else:
                                                                                                  语句块


                                                                                                  while 条件语句:
                                                                                                      循环语句块   #条件为真时执行
                                                                                                  else:
                                                                                                      语句块 #条件为假时执行

                                                                                                  用递归算法实现第n个月兔子的数量:

                                                                                                  兔子的数量以这样的方式增长:每个月的兔子数量等于它前一个月的兔子数量加它前两个月的兔子数量,即f(n)=f(n-1)+f(n-2)。假设第1个月的兔子有2只,第2个月的兔子有3只,你能使用递归的方法求得第n个月的兔子有多少只吗?

                                                                                                    def rabbit_num(n):
                                                                                                    num_list = [2,3]
                                                                                                    if n <= 2:
                                                                                                    return num_list[n-1]
                                                                                                    else:
                                                                                                    return rabbit_num(n-1) + rabbit_num(n-2)


                                                                                                    n = int(input())
                                                                                                    print(rabbit_num(n))

                                                                                                    定义类实现班级管理:

                                                                                                    牛牛的Python老师为了更好地管理班级,利用一个类Student来管理学生,这个类包含了学生姓名(str)、学号(str)、分数(int)、每次作业等级(list[str])等信息。请你帮助牛牛的老师实现这样一个类,并定义构造方法实现初始化,定义打印函数实现打印学生的姓名、学号、分数、提交作业的次数、每次作业的等级。

                                                                                                    类中的 self 代表类的实例,是通过类创建的实例 (注意,在定义类时这个实例我们还没有创建,它表示的我们使用类时创建的那个实例)

                                                                                                    实例属性每个实例各自拥有,互相独立,而类属性有且只有一份实例属性访问优先级比类属性高,所以我们访问时优先访问实例属性,它将屏蔽掉对类属性的访问。

                                                                                                      class Student():
                                                                                                      def __init__(self,name,number,score,grade):
                                                                                                      self.name = name
                                                                                                      self.number = number
                                                                                                      self.score = int(score)
                                                                                                      self.grade = grade.split()


                                                                                                      def info(self):
                                                                                                      print(f"{self.name}'s student number is {self.number}, and his grade is {self.score}. He submitted {len(self.grade)} assignments, each with a grade of {' '.join(self.grade)}")


                                                                                                      a = Student('menkim','12345','90','A B C')
                                                                                                      a.info()


                                                                                                                                                              定义函数相关知识



                                                                                                      实参和形参:

                                                                                                      在调用函数时传给函数或方法的值称为实参,形参指的是出现在函数定义中的名称。

                                                                                                      形参分为五种类型:

                                                                                                      • positional-or-keyword:位置或关键字关键字形参也叫作命名形参。指定一个可以作为位置参数传入也可以作为关键字参数传入的实参。这是默认的形参类型。分别对应下面的foo,bar,在关键字参数里会传入默认值,也称为默认值参数

                                                                                                        def func(foo, bar=None): ...
                                                                                                        • positional-only:仅限位置,指定一个只能通过位置传入的参数,仅限位置形参可通过在函数定义的形参列表中它们之后包含一个 / 字符来定义,例如下面的 posonly1 和 posonly2:

                                                                                                          def func(posonly1, posonly2, , positional_or_keyword): ...
                                                                                                          • keyword-only:仅限关键字,指定一个只能通过关键字传入的参数。仅限关键字形参可通过在函数定义的形参列表中包含单个可变位置形参或者在多个可变位置形参之前放一个 来定义,例如下面的 kw_only1 和 kw_only2:

                                                                                                            def func(arg, *, kw_only1, kw_only2): ...
                                                                                                            • var-positional:可变位置,指定可以提供由一个任意数量的位置参数构成的序列(附加在其他形参已接受的位置参数之后)。这种形参可通过在形参名称前加缀 * 来定义,例如下面的 args:

                                                                                                            • var-keyword:可变关键字,指定可以提供任意数量的关键字参数(附加在其他形参已接受的关键字参数之后)。这种形参可通过在形参名称前加缀 ** 来定义,例如下面的 kwargs。

                                                                                                              def func(*args, **kwargs): ...

                                                                                                              在函数定义形参时为了好理解和调用,一般位置顺序可按从左到右分别为:

                                                                                                              必选参数,关键字参数、默认值参数,可变位置,可变关键字

                                                                                                                def func(foo,bar=None,*args,**kwargs): ...

                                                                                                                在函数调用中传入实参时有两种写法,分别为位置参数和关键字参数调用,函数在调用时关键字参数必须在位置参数后面

                                                                                                                位置参数:不属于关键字参数的参数。位置参数在调用时可出现于参数列表的开头或者作为前面带有 * 的 iterable 里的元素被传入。在函数定义时该参数指定了默认值也可以按顺序用位置参数的写法调用,举例来说,3 和 5 在以下调用中均属于位置参数:

                                                                                                                  def func(name,age,score=90): ...
                                                                                                                  func(3, 5, 80)
                                                                                                                  func(*(35), 80) #*后面是可迭代对象,例如列表、元组、集合等
                                                                                                                  #实际上 * 操作符的作用是将可迭代对象解包出来传递参数
                                                                                                                  #下面的 ** 操作符也是同样的作用

                                                                                                                  关键字参数: 在函数调用中前面带有标识符(例如 name=)或者作为包含在前面带有 ** 的字典里的值传入即使在函数定义时该参数没有指定默认值,也可以用关键字参数来调用;举例来说,3 和 5 在以下对 complex() 的调用中均属于关键字参数:

                                                                                                                    def func(name,age): ...
                                                                                                                    func(name=3, age=5)
                                                                                                                    func(**{'name': 3, 'age': 5}) 
                                                                                                                    #**后面要为mapping
                                                                                                                    #例如dict,collections.defaultdict,collections.OrderedDict

                                                                                                                    注意事项:

                                                                                                                    •  *expression 句法可能出现于显式的关键字参数 之后,但它会在关键字参数(以及任何 **expression 参数)之前被处理:

                                                                                                                      def f(a, b):
                                                                                                                      print(a, b)


                                                                                                                      # f(b=1, *(2,)) # 2 1
                                                                                                                      # f(a=1, *(2,))
                                                                                                                      # TypeError: f() got multiple values for argument 'a'
                                                                                                                      f(1, *(2,)) # 1 2
                                                                                                                      • 一般**kwargs中的键不能与参数列表中其他的参数同名,只有仅限位置形参(位于 之前的参数)的名称可以在 **kwargs 中使用,而不产生歧义,如下:

                                                                                                                        def foo(name, **kwargs):
                                                                                                                            return 'name' in kwargs


                                                                                                                        foo(2,**{'name':3}) 
                                                                                                                        #报错:TypeError: foo() got multiple values for argument 'name'
                                                                                                                          def foo(name,/ , **kwargs):
                                                                                                                          print(name,kwargs['name'])
                                                                                                                          return 'name' in kwargs


                                                                                                                          foo(2,**{'name':3}) #可以使用,不报错
                                                                                                                          输出:
                                                                                                                          2 3
                                                                                                                          True

                                                                                                                          可变位置参数*args和可变关键字参数**kwargs的用法:

                                                                                                                            def cheeseshop(kind, *arguments, **keywords):
                                                                                                                            print("-- Do you have any", kind, "?")
                                                                                                                            print("-- I'm sorry, we're all out of", kind)
                                                                                                                            for arg in arguments:
                                                                                                                            print(arg)
                                                                                                                            print("-" * 40)
                                                                                                                            for kw in keywords:
                                                                                                                            print(kw, ":", keywords[kw])


                                                                                                                            cheeseshop("Limburger", "It's very runny, sir.",
                                                                                                                            "It's really very, VERY runny, sir.",
                                                                                                                            shopkeeper="Michael Palin",
                                                                                                                            client="John Cleese",
                                                                                                                            sketch="Cheese Shop Sketch")
                                                                                                                            print("\n") #两行 ,上下两种调用方法输出一致
                                                                                                                            cheeseshop(*("Limburger", "It's very runny, sir.",
                                                                                                                            "It's really very, VERY runny, sir."),
                                                                                                                            **{"shopkeeper":"Michael Palin",
                                                                                                                            "client":"John Cleese",
                                                                                                                            "sketch":"Cheese Shop Sketch"})

                                                                                                                            在传入参数时,对于可变位置参数*args来说,会将传入的任何额外的位置参数存在元组中,默认是一个空元组;对于**kwargs来说,会将传入的任何额外的关键字参数存到有序映射mapping中,默认为一个相同类型的空映射

                                                                                                                              def foo(*args, **kwargs):
                                                                                                                              a = args
                                                                                                                              b = kwargs
                                                                                                                              print(args,kwargs)
                                                                                                                              print(a,b)
                                                                                                                              for i in args:
                                                                                                                              print(i,end=' ')
                                                                                                                              for j in kwargs:
                                                                                                                              print(j,end=' ')


                                                                                                                              #foo(*[2,3],**{'hah':4,'www':6}) #实际传入了四个参数,可以被使用
                                                                                                                              foo(2,3,'hah'=4,'www'=6#还可以这样写
                                                                                                                              输出:
                                                                                                                              #args 被初始化为一个元组接收额外的位置参数
                                                                                                                              (23) {'hah'4'www'6
                                                                                                                              (23) {'hah'4'www'6}
                                                                                                                              2 3 hah www

                                                                                                                              注意事项:

                                                                                                                              当函数形参默认值为可变对象,例如列表、字典、类实例等时,如果函数修改了该对象,例如向列表中添加了一项,则实际上该默认值也会被修改

                                                                                                                                def f(a, L=[]):
                                                                                                                                L.append(a)
                                                                                                                                return L


                                                                                                                                print(f(1))
                                                                                                                                print(f(2))
                                                                                                                                print(f(3))
                                                                                                                                输出:
                                                                                                                                [1]
                                                                                                                                [1, 2]
                                                                                                                                [1, 2, 3]

                                                                                                                                 绕过此问题的一个方法是使用 None 作为默认值,并在函数体中显式地对其进行测试,例如:


                                                                                                                                  def f(a, L=None):
                                                                                                                                  if L is None:
                                                                                                                                  L = []
                                                                                                                                  L.append(a)
                                                                                                                                  return L


                                                                                                                                  print(f(3))
                                                                                                                                  print(f(4))
                                                                                                                                  输出:
                                                                                                                                  [3]
                                                                                                                                  [4]

                                                                                                                                  将时间戳转换为标准utc日期时间格式的一个方法:

                                                                                                                                    from datetime import datetime 
                                                                                                                                    dt_o = datetime.fromtimestamp(1233456)
                                                                                                                                    print(dt_o)
                                                                                                                                    print(dt_o.year,dt_o.month,dt_o.day,dt_o.hour, dt_o.minute, dt_o.second)
                                                                                                                                    输出:
                                                                                                                                    1970-01-15 14:37:36
                                                                                                                                    1970 1 15 14 37 36

                                                                                                                                    datetime库中几个类对象的用法:

                                                                                                                                    datetime对象:包含来自 date 对象和 time 对象的所有信息的单一对象

                                                                                                                                    datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

                                                                                                                                    timedelta对象:表示两个 date 或者 time 的时间间隔

                                                                                                                                    timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

                                                                                                                                    time对象:代表某日的(本地)时间,它独立于任何特定日期

                                                                                                                                    time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

                                                                                                                                      from datetime import datetime,time
                                                                                                                                      b = datetime(2022,4,9,0,0,0)
                                                                                                                                      a = timedelta(seconds=3661.34,minutes=10,weeks=1)
                                                                                                                                      c = b + a
                                                                                                                                      print(c.day,c.hour,c.minute,c.second)
                                                                                                                                      print(datetime.today())
                                                                                                                                      print(time(microsecond=5))
                                                                                                                                      a
                                                                                                                                      输出:
                                                                                                                                      16 1 11 1
                                                                                                                                      2022-09-07 22:28:48.454689
                                                                                                                                      00:00:00.000005
                                                                                                                                      datetime.timedelta(days=7, seconds=4261, microseconds=340000)

                                                                                                                                      时间戳转换时的UTC标准时间和北京时间问题:

                                                                                                                                      在本地机器上转化一个时间戳时,会默认转化为本地时间,而要将时间戳转换为UTC标准时间需要加一个参数

                                                                                                                                        from datetime import datetime,timezone
                                                                                                                                        a = datetime.fromtimestamp(0) #本地时间
                                                                                                                                        b = datetime.fromtimestamp(0,tz=timezone.utc) #UTC标准时间
                                                                                                                                        print(a,b,sep='\n')
                                                                                                                                        输出:
                                                                                                                                        1970-01-01 08:00:00
                                                                                                                                        1970-01-01 00:00:00+00:00


                                                                                                                                        给出三角形的三个边长a,b,c ,求三角形的周长和面积

                                                                                                                                        求面积可以用海伦公式

                                                                                                                                        p = (a + b + c)/2

                                                                                                                                        面积 S 为 p*(p-a)*(p-b)*(p-c)的开方

                                                                                                                                        math.sqrt(x):返回x 的平方根

                                                                                                                                          import math
                                                                                                                                          a,b,c = map(int,input().split())
                                                                                                                                          p = (a + b + c)/2
                                                                                                                                          s = math.sqrt(p*(p-a)*(p-b)*(p-c)) #面积值
                                                                                                                                          print('circumference=%.2f'%(p*2),'area=%.2f'%s,sep=' ')

                                                                                                                                          求两个正整数的最大公约数和最小公倍数的一个方法:辗转相除法

                                                                                                                                            #欧几里得的辗转相除法:两正整数a,b相除的余数r(a%b)如果为零,则除数b为
                                                                                                                                            #两数的最大公约数,如果余数r不为零,则将b作为被除数,余数r作为除数,继续b%r得到
                                                                                                                                            #余数,一直如此迭代下去,知道余数为0,则将此次的余数作为a,b的最大公约数
                                                                                                                                            #a,b的最小公倍数为(a*b)/最大公约数
                                                                                                                                            n,m = map(int,input().split())
                                                                                                                                            a,b = n,m
                                                                                                                                            r = a % b
                                                                                                                                            while r != 0:
                                                                                                                                            a,b = b,r
                                                                                                                                            r = a % b
                                                                                                                                            d = (n*m)//b #b为最大公约数,d为最小公倍数
                                                                                                                                            print(b+d) #时间复杂度约为O(logN)

                                                                                                                                            注意事项:当浮点数整数位大于16位时会采用科学计数法的表现形式,这个时候再用 int() 转化为整数的时候会出现失真的情况

                                                                                                                                            HTTP状态码:

                                                                                                                                              http_status = {'200':'OK','202':'Accepted','400':'Bad Request',
                                                                                                                                              '403':'Forbidden','404':'Not Found',
                                                                                                                                              '500':'Internal Server Error','502':'Bad Gateway'}
                                                                                                                                              while True:
                                                                                                                                              try:
                                                                                                                                              n = input()
                                                                                                                                              print('%s'%http_status[n])
                                                                                                                                              except:
                                                                                                                                              break

                                                                                                                                              判断三个数是否可以组成一个三角形的一种方法:

                                                                                                                                              满足两短边之和大于最大边或者采用穷举(任意两边之和大于第三边)

                                                                                                                                                while True:
                                                                                                                                                try:
                                                                                                                                                a,b,c = map(float,input().split())
                                                                                                                                                if a + b > c and a + c > b and b + c > a:
                                                                                                                                                if a == b == c:
                                                                                                                                                print('Equilateral triangle!')
                                                                                                                                                elif a == b or a == c or b == c:
                                                                                                                                                print('Isosceles triangle!')
                                                                                                                                                else:
                                                                                                                                                print('Ordinary triangle!')
                                                                                                                                                else:
                                                                                                                                                print('Not a triangle!')
                                                                                                                                                except:
                                                                                                                                                break

                                                                                                                                                获取某年某月的天数方法之一:

                                                                                                                                                  import calendar
                                                                                                                                                  print(calendar.monthrange(2022,8))
                                                                                                                                                  print(calendar._monthlen(2022,8))
                                                                                                                                                  输出:
                                                                                                                                                  (031) #0指的是星期一,0-6分别指星期一到星期日
                                                                                                                                                  31

                                                                                                                                                  一种编写简易计算器的方法,该方法只能实现两个正数的加减乘除运算:

                                                                                                                                                    msg = input()
                                                                                                                                                    try:
                                                                                                                                                    for i in msg:
                                                                                                                                                    if i.isnumeric() or i == '.':
                                                                                                                                                    pass
                                                                                                                                                    else:
                                                                                                                                                    a,b = msg.split(i)
                                                                                                                                                    print('%.4f%s%.4f=%.4f'%(eval(a),i,eval(b),eval(msg)))
                                                                                                                                                    except SyntaxError as e:
                                                                                                                                                    print('Invalid operation!')
                                                                                                                                                    except ZeroDivisionError as e:
                                                                                                                                                    print('Wrong!Division by zero!')

                                                                                                                                                    利用等差数列求1到n的和:

                                                                                                                                                      n = int(input())
                                                                                                                                                      total = (1+n)*n//2
                                                                                                                                                      print(total)

                                                                                                                                                      判断三位数的整数中的质数有多少个计算方法之一:

                                                                                                                                                        n = 0
                                                                                                                                                        for i in range(100,1000):
                                                                                                                                                            flag = 1 #做个标记
                                                                                                                                                        for j in range(2,int(i**0.5)+1):
                                                                                                                                                        if i%j == 0:
                                                                                                                                                        flag = 0
                                                                                                                                                        break
                                                                                                                                                        if flag == 1:
                                                                                                                                                        n += 1
                                                                                                                                                        print(n)

                                                                                                                                                        筛选法求n以内的质数(素数)。筛选法求解过程为:将2~n之间的正整数放在数组内存储,将数组中2之后的所有能被2整除的数删除,再将3之后的所有能被3整除的数删除 ,以此类推,直到n为止。数组中剩下的数即为质数:

                                                                                                                                                          def prime_Number(n):
                                                                                                                                                          ls = [i for i in range(2, n + 1)]
                                                                                                                                                          for i in range(2, n + 1):
                                                                                                                                                          if i not in ls:
                                                                                                                                                          continue
                                                                                                                                                          else:
                                                                                                                                                          l = ls.index(i)
                                                                                                                                                          # 按照堆栈的思想循环,不破坏原来的列表的索引
                                                                                                                                                          for j in range(len(ls) - 1, l, -1):
                                                                                                                                                          if ls[j] % i == 0:
                                                                                                                                                          # ls.remove(ls[j])
                                                                                                                                                          ls.pop(j)
                                                                                                                                                          print(*ls)
                                                                                                                                                          print(n - 1 - len(ls))




                                                                                                                                                          while True:
                                                                                                                                                          try:
                                                                                                                                                          n = int(input())
                                                                                                                                                          prime_Number(n)
                                                                                                                                                          except:
                                                                                                                                                          break

                                                                                                                                                          str.rjust(width[, fillchar]) #字符串固定长度填充的方法

                                                                                                                                                          返回长度为 width 的字符串,原字符串在其中靠右对齐。 使用指定的 fillchar 填充空位 (默认使用 ASCII 空格符)。 如果 width 小于等于 len(s) 则返回原字符串的副本。

                                                                                                                                                          str.ljust(width[, fillchar]) #原字符串在其中靠左对齐

                                                                                                                                                            'menkim'.rjust(8) #'  menkim'
                                                                                                                                                            'menkim'.ljust(8) #'menkim '

                                                                                                                                                            str.center(width[, fillchar])

                                                                                                                                                            返回长度为 width 的字符串,原字符串在其正中。 使用指定的 fillchar 填充两边的空位(默认使用 ASCII 空格符)。 如果 width 小于等于 len(s) 则返回原字符串的副本。

                                                                                                                                                              'menkim'.center(8) #' menkim '

                                                                                                                                                              字符串靠左靠右居中输出的另一种写法:

                                                                                                                                                                #靠左
                                                                                                                                                                '{:<6}'.format(12) #等效于'{:<{}}'.format(12,6)和f'{12:<6}'
                                                                                                                                                                输出:
                                                                                                                                                                '12 '
                                                                                                                                                                #靠右
                                                                                                                                                                '{:>6}'.format(12)
                                                                                                                                                                输出:
                                                                                                                                                                ' 12'
                                                                                                                                                                #居中
                                                                                                                                                                '{:^6}'.format(12)
                                                                                                                                                                输出:
                                                                                                                                                                ' 12 '

                                                                                                                                                                牛客网中实现超级圣诞树的方法之一:https://www.nowcoder.com/practice/470d26c9a73e4e17be8cc45cac843423

                                                                                                                                                                  # 按照对称的思想来解决这个问题
                                                                                                                                                                  # 用列表存储每一行,再循环居中打印出每一行即可得到超级圣诞树的树枝部分
                                                                                                                                                                  # 枝干部分按照输入的值循环居中打印*即可
                                                                                                                                                                  # 关键点在于找到空格的规律和最大行的宽度
                                                                                                                                                                  n = int(input())
                                                                                                                                                                  # 构造基本单元
                                                                                                                                                                  ls = ["*", "* *", "* * *"]
                                                                                                                                                                  # 定义一个函数用于往列表中插入数据
                                                                                                                                                                  def Write(ls):
                                                                                                                                                                  length = len(ls) #因为列表是可变的,所以要将长度定下来
                                                                                                                                                                  for i in range(length):
                                                                                                                                                                  ls.append(ls[i] + " " * (2 * length - 1 - 2 * i) + ls[i])
                                                                                                                                                                  return ls




                                                                                                                                                                  # 将树枝存入列表中
                                                                                                                                                                  for j in range(1, n):
                                                                                                                                                                  Write(ls)
                                                                                                                                                                  # 求出最大宽度
                                                                                                                                                                  width = 6 * (2 ** (n - 1)) - 1
                                                                                                                                                                  # 输出树枝
                                                                                                                                                                  for i in range(len(ls)):
                                                                                                                                                                  print(ls[i].center(width))
                                                                                                                                                                  # 输出树干
                                                                                                                                                                  for _ in range(n):
                                                                                                                                                                  print("*".center(width))

                                                                                                                                                                  用列表创建伪二维矩阵并找到里面对应索引元素的方法之一:

                                                                                                                                                                    #创建n行m列的矩阵
                                                                                                                                                                    n,m = map(int,input().split())
                                                                                                                                                                    ls = [[0 for _ in range(m)] for _ in range(n)]
                                                                                                                                                                    for i in range(n):
                                                                                                                                                                    ls[i] = list(map(int,input().split()))
                                                                                                                                                                    #找到x行y列的元素
                                                                                                                                                                    x,y = map(int,input().split())
                                                                                                                                                                    print(ls[x-1][y-1])


                                                                                                                                                                    暂时先写这么多,下一篇将重点介绍python数据分析相关的第三方工具库和一些简单的机器学习相关知识。

                                                                                                                                                                    文章转载自一生求阙,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                                                                                                                    评论