Python基础语法

Python基础

# print absolute value of an integer:
a = 100
if a >= 0:
    print(a)
else:
    print(-a)
  • Python的语法比较简单

    • #开头的语句是注释

    • 当语句以冒号:结尾时,缩进的语句视为代码块

    • 缩进实用四个空格的缩进

    • 议input

      • input()读取用户的输入

      • birth = input('birth: ')
        if birth < 2000:
            print('00前')
        
        TypeError: unorderable types: str() > int()
        
      • 因为input()返回的数据类型是strstr不能直接和整数比较,必须先把str转换成整数

      • s = input('birth: ')
        birth = int(s)
        if birth < 2000:
            print('00前')
        

        可以得到正确地结果

    • 议不可变对象:str是不变对象,list是可变对象

      • 对于可变对象,比如list

        >>> a = ['c', 'b', 'a']
        >>> a.sort()
        >>> a
        ['a', 'b', 'c']
        
      • 对于不可变对象,比如str

        >>> a = 'abc'
        >>> b = a.replace('a', 'A')
        >>> b
        'Abc'
        >>> a
        'abc'
        
      • 对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的

    • 注意,赋值语句:

      a, b = b, a + b
      

      相当于:

      t = (b, a + b) # t是一个tuple
      a = t[0]
      b = t[1]
      
  • 数据类型

    • 整数:可以处理任意大小,用十六进制表示比较方便0xff00

    • 浮点数:小数,对于很大或很小的浮点数,就必须用科学计数法

      • 1.23x109是1.23e9,或者12.3e8,0.000012可以写成1.2e-5
    • 字符串:以单引号'或双引号"括起来的任意文本

      • 字符串内部既包含'又包含"怎么办?可以用转义字符\来标识
      • 比如\n表示换行,\t表示制表符,字符\本身也要转义,所以\\表示的字符就是\
      • r''表示''内部的字符串默认不转义
    • 布尔值

      • 以直接用TrueFalse表示布尔值(请注意大小写)
      • 布尔值可以用andornot运算
    • 空值

      • 空值是Python里一个特殊的值,用None表示
  • 变量:

    • 变量名必须是大小写英文、数字和_的组合,且不能用数字开头
    • 等号=是赋值语句,可以把任意数据类型赋值给变量同一个变量可以反复赋值,而且可以是不同类型的变量
    • 这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错
  • 常量:

    • 不能变的常量

    • 在python中有两种除法

      • /除法计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数:

        >>> 9 / 3
        3.0
        
      • //,称为地板除,两个整数的除法仍然是整数:

        >>> 10 // 3
        3
        
  • 字符串和编码

    • 字符编码

      • 只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码

      • Unicode所有语言都统一到一套编码里,这样就不会再有乱码问题了

      • Unicode对于全英文会耗费空间,本着节约的精神,UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节

        字符ASCIIUnicodeUTF-8
        A0100000100000000 0100000101000001
        01001110 0010110111100100 10111000 10101101
      • 计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码

    • python字符串

      • ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符

        >>> ord('中')
        20013
        >>> chr(25991)
        '文'
        
      • 内存中以Unicode表示,要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes,用带b前缀的单引号或双引号表示:

        x = b'ABC'
        
      • 以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:

        '中文'.encode('utf-8')
        b'\xe4\xb8\xad\xe6\x96\x87'
        
      • bytes变为str,就需要用decode()方法:

        >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
        '中文'
        
      • 计算str包含多少个字符,可以用len()函数:

        >>> len('ABC')
        3
        >>> len('中文')
        2
        

        如果换成byteslen()函数就计算字节数:

        >>> len(b'ABC')
        3
        >>> len(b'\xe4\xb8\xad\xe6\x96\x87')
        6
        
    • 字符串格式化

      • 使用占位符,变量可以变化,用%%来表示一个%

        >>> 'Hello, %s' % 'world'
        'Hello, world'
        >>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
        'Hi, Michael, you have $1000000.'
        
      • 使用以f开头的字符串,字符串如果包含{xxx},就会以对应的变量替换

        >>> r = 2.5
        >>> s = 3.14 * r ** 2
        >>> print(f'The area of a circle with radius {r} is {s:.2f}')
        The area of a circle with radius 2.5 is 19.62
        
  • 使用listtuple

    • **list ** 是一种有序的集合,可以随时添加和删除其中的元素

      • >>> classmates = ['Michael', 'Bob', 'Tracy']
        >>> classmates
        ['Michael', 'Bob', 'Tracy']
        
      • >>> len(classmates)
        3
        
      • 用索引来访问list中每一个位置的元素,记得索引是从0开始的:

        >>> classmates[0]
        'Michael'
        >>> classmates[3]
        IndexError: list index out of range
        
        >>> classmates[-1]
        'Tracy'
        >>> classmates[-2]
        'Bob'
        >>> classmates[-4]
        IndexError: list index out of range
        
      • 可以往list中追加元素到末尾:

        >>> classmates.append('Adam')
        >>> classmates
        ['Michael', 'Bob', 'Tracy', 'Adam']
        

        把元素插入到指定的位置,比如索引号为1的位置:

        >>> classmates.insert(1, 'Jack')
        >>> classmates
        ['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
        
      • 删除list末尾的元素,用pop()方法:

        >>> classmates.pop()
        'Adam'
        >>> classmates
        ['Michael', 'Jack', 'Bob', 'Tracy']
        

        要删除指定位置的元素,用pop(i)方法,其中i是索引位置:

        >>> classmates.pop(1)
        'Jack'
        >>> classmates
        ['Michael', 'Bob', 'Tracy']
        
      • 把某个元素替换成别的元素,可以直接赋值给对应的索引位置:

        >>> classmates[1] = 'Sarah'
        >>> classmates
        ['Michael', 'Sarah', 'Tracy']
        

        list里面的元素的数据类型也可以不同,比如:

        >>> L = ['Apple', 123, True]
        
      • 拿到'php'可以写p[1]或者s[2][1],list元素也可以是另一个list

        >>> p = ['asp', 'php']
        >>> s = ['python', 'java', p, 'scheme']
        
      • 一个list中一个元素也没有,就是一个空的list,它的长度为0:

        >>> L = []
        >>> len(L)
        0
        
    • tuple : 一旦初始化就不能修改

      • 没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用classmates[0]classmates[-1],但不能赋值成另外的元素

        >>> t = (1, 2)
        >>> t
        (1, 2)
        
      • 只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:

        >>> t = (1,)
        >>> t
        (1,)
        
      • 看一个“可变的”tuple:理解:指向不变

        >>> t = ('a', 'b', ['A', 'B'])
        >>> t[2][0] = 'X'
        >>> t[2][1] = 'Y'
        >>> t
        ('a', 'b', ['X', 'Y'])
        
  • 条件判断

    • if语句的完整形式就是:

      if <条件判断1>:
          <执行1>
      elif <条件判断2>:
          <执行2>
      elif <条件判断3>:
          <执行3>
      else:
          <执行4>
      

      不要少写了冒号:,用elif做更细致:

      age = 3
      if age >= 18:
          print('adult')
      elif age >= 6:
          print('teenager')
      else:
          print('kid')
      

      if判断条件还可以简写,比如写:

      if x:
          print('True')
      

      只要x是非零数值、非空字符串、非空list等,就判断为True,否则为False

    • match语句

      score = 'B'
      
      match score:
          case 'A':
              print('score is A.')
          case 'B':
              print('score is B.')
          case 'C':
              print('score is C.')
          case _: # _表示匹配到其他任何情况
              print('score is ???.')
      
      • 使用match语句时,我们依次用case xxx匹配,并且可以在最后(且仅能在最后)加一个case _表示“任意值”,代码较if ... elif ... else ...更易读
      age = 15
      
      match age:
          case x if x < 10:
              print(f'< 10 years old: {x}')
          case 10:
              print('10 years old.')
          case 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18:
              print('11~18 years old.')
          case 19:
              print('19 years old.')
          case _:
              print('not sure.')
      
      • 第一个case x if x < 10表示当age < 10成立时匹配,且赋值给变量x,第二个case 10仅匹配单个值,第三个case 11|12|...|18能匹配多个值,用|分隔
  • 循环

    • for...in循环,依次把list或tuple中的每个元素迭代出来

      sum = 0
      for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
          sum = sum + x
      print(sum)
      
      • range(101)就可以生成0-100的整数序列,计算如下:
      sum = 0
      for x in range(101):
          sum = sum + x
      print(sum)
      
    • while循环

      sum = 0
      n = 99
      while n > 0:
          sum = sum + n
          n = n - 2
      print(sum)
      

      提前结束循环,可以用break语句:

      n = 1
      while n <= 100:
          if n > 10: # 当n = 11时,条件满足,执行break语句
              break # break语句会结束当前循环
          print(n)
          n = n + 1
      print('END')
      

      continue语句跳过某些循环:

      n = 0
      while n < 10:
          n = n + 1
          if n % 2 == 0: # 如果n是偶数,执行continue语句
              continue # continue语句会直接继续下一轮循环,后续的print()语句不会执行
          print(n)
      
  • 使用dictset

    • dict内部存放的顺序和key放入的顺序是没有关系的

      >>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
      >>> d['Michael']
      95
      

      通过key放入:

      >>> d['Adam'] = 67
      >>> d['Adam']
      67
      

      key不存在,dict就会报错:

      >>> d['Thomas']
      KeyError: 'Thomas'
      

      要避免key不存在的错误

      • 一是通过in判断key是否存在:

        >>> 'Thomas' in d
        False
        
      • 通过dict提供的get()方法,如果key不存在,可以返回None,或指定的value:

        >>> d.get('Thomas')
        >>> d.get('Thomas', -1)
        -1
        

      删除一个key,用pop(key)方法,对应的value也会从dict中删除:

      >>> d.pop('Bob')
      75
      >>> d
      {'Michael': 95, 'Tracy': 85}
      
    • set也是一组key的集合,但不存储value,没有重复的key

      创建一个set,用{x,y,z,...}列出每个元素:

      >>> s = {1, 2, 3}
      >>> s
      {1, 2, 3}
      

      重复元素在set中自动被过滤:

      >>> s = {1, 1, 2, 2, 3, 3}
      >>> s
      {1, 2, 3}
      

      通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:

      >>> s.add(4)
      >>> s
      {1, 2, 3, 4}
      >>> s.add(4)
      >>> s
      {1, 2, 3, 4}
      

      通过remove(key)方法可以删除元素:

      >>> s.remove(4)
      >>> s
      {1, 2, 3}