Python学习笔记(1)——基本中的基本知识

Python3学习日志

基础篇

  • 环境:
    • python 3.8.2
    • OS: Windows10 1909

数据类型

python3中的数据类型:

刚一接触python,就发现python对数据类型的区分并不如C那样敏感,定义一个变量甚至不需要预先加上各种前缀,而这在C/C++中是非常不可思议的

  • 按修改可否:

    • 常量:值固定的一串数据,不可被修改

    • 变量:其值可被修改的一串内存空间,用来标识它的名称(变量名)须符合变量命名规范

      • 只能由连续的字母、数字和下划线组成,且不能以数字开头,要避免与关键字和函数名冲突)

基本类型

整数

  • 整数
    • 字面意思,和数学领域中一样,单纯的不包含小数点的整数

浮点数

  • 浮点数
    • 所有带小数点的数
    • Python中涉及到含小数位的运算,可能会产生与逻辑结果相悖的结果

字符串

  • 字符/字符串
    • 在Python中似乎并没有严格区分字符和字符串,而是统一将其定义为了string类型,''和""的效果也完全相同,但不可混用,单双引号必须各自成对,只有在嵌套时才要错开使用
      • eg. print('She say:"Hello, World"!')
    • 字符串可使用+运算符进行拼接
    • 字符串的格式化函数
      • 大写改小写小写改大写(大小写逆转):变量名.title()
      • 全部格式化为大写:变量名.upper()
      • 全部格式化为小写:变量名.lower()
      • 删除字符串中的多余空白:变量名.strip()
        • 只删除开头的多余空白:变量名.lstrip()
        • 只删除结尾的多余空白:变量名.rstrip()

强制类型转换

  • 数字与字符的误读问题

  • 不需事先定义变量类型虽然带来了方便,但是在python中可能会出现数字或字符/字符串被误读的情况,此时需使用强制类型转换

  • str()/int()/float()函数

    • eg.vatr1 = str(12)
  • 函数描述

    int(x [,base])

    将x转换为一个整数

    long(x [,base] )

    将x转换为一个长整数

    float(x)

    将x转换到一个浮点数

    complex(real [,imag])

    创建一个复数

    str(x)

    将对象 x 转换为字符串

    repr(x)

    将对象 x 转换为表达式字符串

    eval(str)

    用来计算在字符串中的有效Python表达式,并返回一个对象

    tuple(s)

    将序列 s 转换为一个元组

    list(s)

    将序列 s 转换为一个列表

    set(s)

    转换为可变集合

    dict(d)

    创建一个字典。d 必须是一个序列 (key,value)元组。

    frozenset(s)

    转换为不可变集合

    chr(x)

    将一个整数转换为一个字符

    unichr(x)

    将一个整数转换为Unicode字符

    ord(x)

    将一个字符转换为它的整数值

    hex(x)

    将一个整数转换为一个十六进制字符串

    oct(x)

    将一个整数转换为一个八进制字符串

加强的数组

  • 前面也提到了,因为python中并不需要对变量的数据类型预先声明,所以下面的三种数据类型都可以看作是某种拥有特定格式的“数组”,包括:
  • 列表
  • 元祖
  • 字典

列表

  • 列表:可以存入任意数据类型的元素,以方扩号进行声明,与C/C++相似
    • 每一个元素对应一个索引/下标
    • 索引/下标从0开始
    • 以逗号分隔元素
    • 列表内元素可以动态增删修改
  • 声明格式:eg_list = ['Suziki', 123, 'Yamaha', 3.14159, 5]
索引的使用
  • 列表名后跟上含索引值的方括号,即可使用某一索引位的元素
  • 示例:eg_list[0] eg_list[3]
  • 注意:索引值为负时,会从列表右侧开始获取元素,如:
    • 获取最后一位元素:eg_list[-1]
    • 获取倒数第三位元素:eg_list[-3]
增删修改
  • 修改:

    • 类似变量重定义,先利用索引固定到某一元素,然后对其重新赋值
    • 示例:`eg_list[-1] = 'kawasaki'
  • 添加/插入:

    • 末尾添加:
      • 格式:列表名.append(元素值)
      • 示例:eg_list.append('911')
    • 表中插入:
      • 格式:列表名.insert(索引值,元素值)
      • 示例:eg_list.insert(6,'seven')
  • 删除:

    • del按索引删除:

    • pop弹出:

      • 默认弹出末尾(栈顶)元素

        • 示例:

        • print(eg_list)
          print(eg_list.pop())
                  
          print(eg_list)
          -------
          ['Suzuki', 123, 'Yamaha', 3.14159, 'Kawasaki', 911, 'seven']
          seven
          ['Suzuki', 123, 'Yamaha', 3.14159, 'Kawasaki', 911]
          
      • 弹出指定位置元素

        • 格式:列表名.pop(索引值)

        • 示例:

          eg_list = ['Suzuki', 123, 'Yamaha', 3.14159, 'Kawasaki', 911]
          print(eg_list)
          print(eg_list.pop(3))
          print(eg_list)
          -------
          ['Suzuki', 123, 'Yamaha', 3.14159, 'Kawasaki', 911]
          3.14159
          ['Suzuki', 123, 'Yamaha', 'Kawasaki', 911]
          
      • 注意:用pop()方式弹出相当于将列表中的某一个元素移出该列表,此时会将该元素作为pop()函数返回值返回

    • remove按值删除:根据指定值移出表中的元素,无返回值

      • 格式:列表名.remove(值)

      • 示例:

        eg_list = ['Suzuki', 123, 'Yamaha', 3.14159, 'Kawasaki', 911, 'seven']
        eg_list_remove = 'Kawasaki'
        eg_list.remove(eg_list_remove)
        print('The ' + eg_list_remove + ' is too expensive for me')
        ---------
        The Kawasaki is too expensive for me
        
      • 注意:使用remove移出元素时,默认只会根据顺序,移除匹配到的第一个元素

排序
  • 按字母排序

    • sort()

      • 格式:列表名.sort() //括号内可加参数,如reverse=TRUE,即反转顺序,由z向a排序

      • 示例:

        eg_list = ['Suzuki', 'Yamaha', 'Kawasaki', 'seven']
        print('-'*6 + 'before sort ' + '-'*6)
        print(eg_list)
        eg_list.sort()
        print('-'*6 + 'after sort ' + '-'*6)
        print(eg_list)
        print("")
        
        eg_list = ['Suzuki' ,'Yamaha', 'Kawasaki', 'seven']
        print('-'*6 + 'before sort ' + '-'*6)
        print(eg_list)
        eg_list.sort(reverse=True)
        print('-'*6 + 'after sort ' + '-'*6)
        print(eg_list)
        ==================Run=====================
        
        ------before sort ------
        ['Suzuki', 'Yamaha', 'Kawasaki', 'seven']
        ------after sort ------
        ['Kawasaki', 'Suzuki', 'Yamaha', 'seven']
        
        ------before sort ------
        ['Suzuki', 'Yamaha', 'Kawasaki', 'seven']
        ------after sort ------
        ['seven', 'Yamaha', 'Suzuki', 'Kawasaki']
        
      • 注意:

        • 使用sort()对列表进行排序后无法撤销操作,列表的原有顺序无法溯回
        • sort()排序只能对str类型的列表排序,若列表含数值类型的元素则会报错
        • sort()排序默认按照以大写字母优先,先对大写字母按顺序排好,再对小写字母进行排序
        • sort()函数无返回值
    • sorted():

      • 说明:sorted()和sort()操作效果相同,但是不会对原列表造成更改,只会返回一个按sort()方式排序好的列表

      • 格式:sorted(列表名)

      • 示例:

        eg_list = ['Suzuki', 'Yamaha', 'Kawasaki', 'seven']
        print('-'*6 + 'before sorted ' + '-'*6)
        print(eg_list)
        
        print(sorted(eg_list))
        print('-'*6 + 'after sort ' + '-'*6)
        print(eg_list)
        ==================Run=====================
        
        ------before sorted ------
        ['Suzuki', 'Yamaha', 'Kawasaki', 'seven']
        ['Kawasaki', 'Suzuki', 'Yamaha', 'seven']
        ------after sort ------
        ['Suzuki', 'Yamaha', 'Kawasaki', 'seven']
        
  • 逆转顺序reverse()

    • 格式:列表名.reverse()

    • 示例:

      eg_list = ['Suzuki', 'Yamaha', 'Kawasaki', 'seven']
      print('-'*6 + 'before reverse ' + '-'*6)
      print(eg_list)
      
      print('-'*6 + 'after reverse ' + '-'*6)
      eg_list.reverse()
      print(eg_list)
      ==================Run=====================
      
      ------before reverse ------
      ['Suzuki', 'Yamaha', 'Kawasaki', 'seven']
      ------after reverse ------
      ['seven', 'Kawasaki', 'Yamaha', 'Suzuki']
      
    • 注意:

      • reverse()函数会对原列表顺序造成更改,但再逆转一次就可恢复
      • reverse()无返回值
测长
  • 测量列表长度:len()

    • 格式:len(列表名)

    • 示例:

      eg_list = ['Suzuki', 'Yamaha', 'Kawasaki', 'seven']
      print('eg_list\'s length is: ' + str(len(eg_list)))
      ==================Run=====================
      
      the length of eg_list length is: 4
      
    • 注意:len()返回的长度值从1开始计数,与人类逻辑一致

切片

之所以说列表是增强版的数组,不光是因为其可以搭配各种函数使用,更是因为它拥有强大的切片功能——截取某一区间的元素

  • 格式:列表名[索引值1:索引值2]

  • 示例:

    eg_list = ['Suzuki', 'Yamaha', 'Kawasaki', 'seven']
    print(eg_list[1:3])
    
  • 注意:

    • 切片可用在for循环中for eg_list in eg_lists[:-1]
    • 如果起始和结束位不省略,则无法到达结束位,默认为半闭半开区间,即结束位只到其索引值-1处
      • 对于eg_list[0:3],只截到索引为0, 1, 2的三个元素
    • 起始和结束位都可省略
      • eg_list[:-1]:表示从开头截取到最后一位
      • eg_list[1:]:表示从索引1一直截取到列表最后
      • eg_list[:]:表示从开头截取到列表最后

元组

  • 元组:实际上元组只是列表的常量版,是一种只可以被重新定义,但不可修改元素的特殊列表
  • 与列表区别:元组使用圆括号进行声明,元素不可修改
  • 操作:除涉及到修改的操作外,其余操作和列表完全相同,可遍历,可切片
    • 其中切片方式与列表相同,使用方括号[]而不是圆括号()

字典

如果说列表还只是数组增强版,那么字典完全就是被魔改成另一个东西的存在了,它通过元素两两构成键-值对的方式存储数据,二者间互相关联,通过键(keys)就可以得到值(values)

  • 格式:字典名 = {'键1':'值1', 键2:'值2', '键3', 值3}

  • 空字典:字典名 = {}

  • 示例:

    # 可以看到,字典内包含了多种对象
    # 当然,实际应用中并不推荐存入这么混乱的数据
    eg_dict = {'key0':'value0', 1:['va','lue',1], 'key2': {'key':2}}
    print(eg_dict)
    ==================Run=====================
    {'key0': 'value0', 1: ['va', 'lue', 1], 'key2': {'key': 2}}
    
  • 注意:

    • 字典中键-值对的数量不受限制
  • 值可以是任意对象,包括但不限于数字、字符串、列表、字典

  • 添加键-值对

    • 示例

      eg_dict['key3'] = 12
      eg_dict[4] = 'key4'
      print(eg_dict)
      ==================Run=====================
      {'key0': 'value0', 1: ['va', 'lue', 1], 'key2': {'key': 2}, 'key3': 12, 4: 'key4'}
      
  • 删除键-值对

    • 示例:

      del eg_dict[4]
      print(eg_dict)
      ==================Run=====================
      {'key0': 'value0', 1: ['va', 'lue', 1], 'key2': {'key': 2}, 'key3': 12}
      
  • 访问值

    • 示例:

      print(eg_dict[key0])
      ==================Run=====================
      value0
      
  • 修改值

    eg_dict['key0'] = 're_value0'
    ==================Run=====================
    re_value0
    
  • 获取键:eg_dict.keys()

  • 示例:

    name = eg_dict.keys()
    print(name)
    
遍历
  • 遍历键-值对

    • 函数:items()

    • 示例:

      for key,value in eg_dict.items():
          print('-'*10)
          print('key:\t' + str(key))
          //因为字典中包含非字符串类型数据,无法直接进行拼接
          //所以使用str()将字典内所有元素强制转换为字符串类型
          print('value:\t' + str(value))
      
  • 遍历键/值

    • 示例:

      for key in eg_dict.keys():
          print(key)
          
      for values in eg_dict.values():
          print(values)
      
  • 按顺序遍历键

    • 说明:因为在python中,并不关心字典的顺序,只在乎键-值之间的关联关系,所以在获取字典元素时,元素的顺序往往不可预测

    • 解决办法:使用sorted()

    • 示例:

      for eg_dict_sort in sorted(eg_dict.keys()):
          print(name)
      
    
    

##### 嵌套

- 说明:字典的嵌套一般分为三种:

  - 列表中嵌套字典
  - 字典中嵌套列表
  - 字典中嵌套字典

> 因为在一开始介绍字典的格式匙,便使用过了字典嵌套列表和字典嵌套字典,列表也只是将内部元素改为了字典,故不再赘述

#### 集合

- 说明:

  - 集合set()一个内置函数,可将括号内的对象转换为集合对象
  - 集合中的数据唯一确定,不可重复,因此可用它来消除其余对象中的重复部分

- 使用:

  ```python
  eg_arrg = set(eg_dict.values)

运算符

python中的运算符还是相当丰富的,各种运算几乎都能被囊括在内

分类

  • 算术运算符 + - * / % ** //

    • 加减乘除:+ - * /
    • 取模(除法的余数):%
    • 幂(x的y次方):**
    • 取整除(返回商的整数部分)://
  • 比较运算符== != > < >= <=

    • 返回布尔值
  • 赋值运算符= += -= *= /= %= *= //=

    • 右结合,先在右侧运算算术部分,再向左赋值
  • 位运算符 & | ^ ~ << >>

    • 按位与&
    • 按位或|
    • 按位异或^
    • 按位取反~
    • 左移右移<< >>
  • 逻辑运算符and or not

    • 布尔与and

    • 布尔或or

    • 布尔非not

    • 运算符逻辑表达式描述实例
      andx and y 布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 (a and b) 返回 20。
      orx or y布尔"或" - 如果 x 是非 0,它返回 x 的值,否则它返回 y 的计算值。 (a or b) 返回 10。
      notnot x布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 not(a and b) 返回 False
  • 成员运算符in not in

    • 是否在序列中in
    • 是否不在序列中not in
    • 返回布尔值
  • 身份运算符is is not

    • 判断两个标识符是否引自同一对象
    • 判断两个标识符是否不引自同一对象
    • 注意:
      • 返回布尔值
      • 类似获取对象内存地址函数:id()

运算符优先级

运算符描述
** 指数 (最高优先级)
~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % // 乘,除,取模和取整除
+ - 加法减法
>> << 右移,左移运算符
& 位 'AND'
^ | 位运算符
<= < > >= 比较运算符
<> == != 等于运算符
= %= /= //= -= += *= **= 赋值运算符
is is not 身份运算符
in not in 成员运算符
not and or 逻辑运算符

语句

分支 判断

对于一条或一段代码,只有在满足条件时才能执行,即分支-判断

python中用if-else和if-elif-else来完成,else可省略

实际上到了这里,写起python代码来,与其他语言的不同才体现出来,它以冒号和缩进来区分代码块,相较于用{}来区分的方式,这种方式无论优劣与否,能让书写代码和阅读代码的人感到身心愉悦是一定的(黑客再也不用担心拿到的源码全是}了:D)

  • 格式:

    if 变量/常量/表达式:
    	语句1
        	子语句
        语句2
        语句3
    
  • 说明:

    • if 变量/常量/表达式:部分为条件判断式,无论if后面是变量还是常量又或者是表达式,只要最后产生的值是非0或非假的,就执行其后一个缩进块内的语句

单分支

  • if单分支结构

  • 示例:

    eg_int_var = 0
    if eg_int_var:
        print("hello")
    
    eg_int_var = 1
    if eg_int_var:
        print("Hi")
    ==================Run=====================
    
    Hi
    

双分支

  • if-else双分支结构

  • 示例:

    eg_int_var = 0
    if eg_int_var:
        print("yes")
    else:
        print("no")
    ==================Run=====================
    
    no
    

多分支

  • if-elif-else多分支结构

  • 示例:

    eg_lists = ['Benz', 'Yamaha', 'Kawasaki', 'seven']
    for eg_list in eg_lists:
        if(eg_list == 'Yamaha'):
            print(eg_list + ' is in Japan')
        elif(eg_list == 'benz'):
            print(eg_list + ' is in Germany')
        else:
            print(eg_list + ' cannot find')
    ==================Run=====================
    
    Benz cannot find
    Yamaha is in Japan
    Kawasaki cannot find
    seven cannot find
    

循环

在python中只有for循环和while循环两种循环

  • 循环控制语句
    • break:执行到此处时,结束本轮循环并跳出整层循环
    • continue:执行到此处时,结束本轮循环并开始下一轮循环
    • pass:不执行任何操作,一般用来占位,使循环结构完整

for循环

  • 格式:

    for 临时变量名 in 序列
    
  • 说明:

    • 临时变量名不得与已有变量重名,for循环结束后自动销毁
    • for循环可以遍历任何序列,序列可以是列表、元祖等,也可以是一个字符串
    • 临时变量可以有多个,以逗号分隔

while循环

range()

else搭配

python中常会出现奇奇怪怪的语句,for-else和while-else就是其中一种

  • for-else:

    • 示例:

      eg_lists = ['Benz', 'Yamaha', 'Kawasaki', 'seven']
      for eg_list in eg_lists:
          print(eg_list + ' have bought')
      else:
          print('All motor sell out')
      ==================Run=====================
      Benz have bought
      Yamaha have bought
      Kawasaki have bought
      seven have bought
      All motor sell out
      
  • while-else:

    • 示例:

      eg_var = 1
      while(eg_var < 4):
          print(eg_var)
          eg_var += 1
      else:
          print("eg_var >= 10")
      ==================Run=====================
      1
      2
      3
      eg_var >= 10
      
    • 说明:else只有当while()括号内的值为0或为假时,即循环正常结束时才执行,若遇到break也不会执行

文中代码参考自Eric Matthes的《Python Crash Course》

posted @ 2020-07-09 09:42  柊离  阅读(93)  评论(0)    收藏  举报