跳转至

📔 Python基础编程 学习笔记

1. Python概述

  • Python是目前流行的编程语言之一,因简单、易于学习的语法而受欢迎。

  • Python 是Guido Van Rossum(龟叔)在1989年编写出的编程语言。

  • Python提供了很多基础库,包括网络、文件、数据库、文本处理等。所以无需从零开发库,直接调用现成的库即可完成对应的功能开发。

  • Python是一个面向对象的高级语言,也是动态解释型语言。

  • 现目前已经基本上都是Python3的场景,所以也就不写那种问Python2和Python3区别的脑瘫面试问题的总结。

  • Python环境配置篇自行Google。

1.1 编程型和解释型的区别

参考资料:Stanford CS143 Lecture01

直接将程序作为输入,然后会输出一个可执行文件。对于可执行文件来说,可能是汇编语言,也可能是字节码,可以是任意数量不同的实现语言。通过使用数据在执行文件中进行结果的输出。

在生成可执行文件的过程就是预处理的过程,可以在许多不同的输入上运行系统的可执行文件

  • 对于机器来说,离线可用。
  • 需要将源文件翻译成机器语言

编译器:阅读以某一种语言(源语言、汇编语言等)编写的程序,把该程序翻译成另一种语言编写的程序(等价转换)。

功能:发现在翻译程序过程中发现源程序中的错误。

1.1.2 解释器 -- "在线"运行

  • 对于解释器来说可以是在线。
  • 无需任何操作,直接可run。

解释器:直接利用用户提供的输入执行源程序中指定的操作。无需程序翻译的过程。常见的语言:Java、Python。

⚠️注意:在输入到输出的过程中,编译器产生目标程序的速度比解释器快,但解释器的错误排查效果比编译器好。

1.1.3 两者的区别总结

  • 编译型(如C语言)

    • 将程序代码直接翻译(常见的翻译器:gcc)成计算机能够识别的二进制指令,之后OS拿着编译好的二进制文件直接操作硬件。
  • 解释型(Python)

    • 解释型,解释一行,执行一行,直接讲程序代码编译为字节码,然后让机器能够解析处理。

    • 通过解释器将程序直接转换成机器可执行的代码。

1.1 Python的优缺点

  • 优点

    • 简单性,易于学习,上手快
    • 代码规范度高,可阅读性强。
    • 可维护性强
    • 交互模式执行
    • 可移植性强
    • 提供了丰富的执行库
    • 跨平台性强
  • 缺点

    • 效率相比于编译型的语言低。
    • Python代码只有运行时才会有错误提示。
    • 硬件方面的扩展性不高。

1.2 Python的应用场景

  • 网站建设

    • Python Web的前端和后端都会有使用。
  • AI发展领域

    • NLP、CV、机器学习等领域
  • Python自动化测试

    • 典型测试框架:Pytest
  • 游戏工具

  • 数据分析和数据挖掘

    • Python爬虫
    • 通过数据处理相关的库(Numpy、Pandas、Matplotlib等),让数据更加可视化。
  • 科学计算

    • 简单易上手
  • 写小工具

2. Python基础语法概念

2.1 编程格式

对于Python,默认的编码格式是以 UTF-8 编码。所有的字符串都是Unicode字符串。

但也可以通过指定特定的编码格式:

1
2
3
# -*- coding utf-8 -*-

# coding: utf-8

Python中常见的几种编码格式:

  • ASCII表

    • 只支持英文字符串
    • 采用8位二进制数字对应一个英文字符串
  • GBK表

    • 支持英文字符、中文字符
    • 采用8位二进制数对应一个英文字符串
    • 采用16位二进制数对应一个中文字符串
  • Unicode(内存中统一使用unicode)

    • 兼容多个国家字符
    • 采用16位二进制数对应一个中文字符串
    • 个别生僻字会采用4位或者8位二进制数
  • UTF-8:(unicode transform format-8)

    • 1 Bytes 英文
    • 3 Bytes 汉字

2.1 Python标识符

对于标识符来说,Python和基本上的编程语言的规则是类似的。

  • 第一个字符必须是字母或者下划线("_")

  • 标识符的其它部分可以是字母、数字和下划线组成。

  • 标识符区分大小写,大小写比较敏感。

Python3中,非ASCII码的标识符也是被允许使用的。

2.2 Python中常见的关键字

和C/C++语言一样,Python也有对应的 保留字(也被叫做关键字)

  • 不可以用作任何标识符名称。

通过Python提供的关键字模块相关的库,查看当前的Python版本对应的关键字如下:

1
2
3
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

2.3 注释

  • 注释也是代码中必不可少的一部分。

    • 目的:增强代码的可读性和可维护性
    • 可以让不需要的代码暂时性取消不执行,但不删除代码,增强代码的可调试性。
  • 主要有两种注释方式:

    • 单行注释
    • 多行注释

      # 方式1:使用 # 开头的方式
      
      # 方式2:使用三个双引号
      """
      多行注释内容
      """
      
      # 方式3:使用三个单引号
      '''
      多行注释内容
      '''
      

2.4 变量和常量

  • 变量:可以变化的量。量指代事物的某种状态。

    • 变量的定义分为3个部分:变量名、赋值符号、值。

    • 为什么需要变量?让程序可以记住事物的状态。

    • 对于变量,先定义再引用。例如

      name = "solerho"        # 定义变量(将变量先存进去)
      print(name)             # 直接使用变量(引用)---- 将变量取出来用
      
  • 变量名是指向等号右侧值的内存地址,用来访问等号右侧的值。

  • 变量名的命名规则

    • 以字母、数字、下划线组成,其中不能以数字作为开头。

    • 名字最好是见名知意。例如last_name就表示姓氏。

    • 不要使用中文名,会导致乱码或者其他的问题存在。

    • 两种命名风格

      • 使用驼峰命名方式
      • 全部小写,然后用下划线连接。(在python中推荐使用这种方式)
  • 变量值的特征

    • 变量值的id:反应的是变量值的内存地址。print(id(varname))
    • 变量值的类型type:反应变量值的数据类型状态。通过 print(type(varname)) ,直接查看数据的数据类型。
    • 变量值的值:值本身。
  • 常量:不变的量

    • 注意:python中没有常量的概念,但程序开发过程中会涉及常量的概念。

    • 但可以通过大写字母来表示常量。 ----- 一种规范约定

2.5 缩进

Python通过缩进来表示代码块的区分。

  • 对于同一个代码块来说,对应的空格数要一致。

3. Python基本数据类型

3.1 数字类型

  • int类型(整型)

  • float类型(浮点型)

1
2
3
age = 26

score = 87.9

3.2 字符串类型

  • 引号(单引号、三单引号、双引号、三双引号) 包含的一串字符。

    1
    2
    3
    4
    5
    6
    7
    #也可以直接将三双引号换三单引号
    INFO = """This is message
    This is Message
    """
    
    #纯数字字符,由数字组成的字符串,是字符串类型。
    num='22222'
    
  • 对于在字符串中嵌套使用时,外层使用单引号,则内层使用双引号,反之亦然。一般情况下,直接推荐使用单引号和双引号交互使用。

    • 如何只使用同一种引号,则通过 转义符号(\) 来进行转义。
  • 字符串的拼接

    • 可以通过加法方式进行。但是仅限于字符串和字符串之间使用。但是一般不推荐使用,因为处理效率很低。
  • 打印重复内容

    print('='*10) # 表示打印10个=号
    

3.3 列表类型

  • 列表

    • 索引对应的值。索引从0开始,0代表第一个值。
  • 作用

    • 按位置记录记录多个值,并且按照索引取指定位置的值。
  • 定义

    • [] 内用逗号分隔多个任意类型的指,一个值称为一个元素。
1
2
3
4
scores = [66,77,88,99,87,97]
infor=[["bob",55,"man"],["soler",97,"man"]]
# 例如存一天中不同时刻的温度
temp= [13,22,15,20,17,...]

3.4 字典类型

  • 对于索引描述的是顺序,位置,但对值没有描述性的功能。

  • 字典:就是键值对。也就是 key 都有一个唯一对应的值。

    • key通常是字符串类型,也就是所谓的描述性的功能。
  • 作用:用来存多个值,且每个值都有唯一一个key与其对应。key对值有

  • 语法:在 {} 内使用逗号分隔开多个 key:value,例如:

    1
    2
    3
    4
    5
    6
    infor = {"name":"soler","Score":88,"Sex":"male",....}
    
    print(type(infor)) # 输出为 <class 'dict'>
    
    # 直接对键key进行值,会打印对应的信息
    print(infor[name]) # 打印信息:soler
    
  • 字典是无序的,直接通过键值来取值。

  • 字典和列表可进行嵌套。

3.5 布尔类型

  • 用来记录真假两种状态。

    1
    2
    3
    4
    5
    6
    7
    is_ok=True  # 注意大小写
    is_ok_False # 注意大小写
    
    print(type(is_ok)) #打印信息: <class 'bool'>
    
    x=1
    y=0
    
  • 使用

    • 通常是用来当作判断的条件,一般在一些判断语句中使用。

4. 垃圾回收机制

  • 什么是垃圾回收机制?

    • 垃圾回收(简称GC)是python解释器自带的一种机制,专门用来回收不可用的变量值所占用的空间。
  • 为什么需要GC?

    • 程序在运行过程中会申请大量的内存空间,对于一些无用的内存空间,如果不及时进行清理,则会导致内存消耗殆尽(内存溢出)。从而导致程序崩溃。
  • GC原理分析

    • Python的GC模块运用了 “引用计数(reference counting)”来跟踪和回收垃圾。

    • 在引用计数的基础上,通过标记-清除的方式来解决容器对象可能产生的循环引用的问题。

通过分代回收(generation collection)以空间换时间的方式来进一步提高垃圾回收的效率。

  • 引用计数:变量值被变量名关联的次数。
  • 对于引用分为两种:

    • 直接引用:

    • 间接引用

      • 通过间接赋值转换,最后再使用。
  • 标记清除

    • 容器对象(如list、set、dict、class、instance)都可包含对其他对象的引用,都可能产生循环引用。而标记清除计数则是为了解决循环引用的问题。
  • 分代回收

    • 基于引用计数的回收机制,每次回收内存,都需要把所有对象的引用计数都遍历一遍,会消耗时间,所以引入分代回收来提高回收效率,分代回收采用的是空间换时间的策略。

    • 思想:多次扫描,都没有被回收的变量,gc机制会认为变量是常用变量,gc对其扫描的频率会降低。

    • 具体实现:分代指的是根据存活时间来变量划分不同地等级。

    • 新定义的变量,会被定义为最新的,扫描频率会增加。如果被引用,则扫描频率会减少。

5. 输入和输出

5.1 输入

  • input:接收用户输入。
    • 在Python3中是通过input将用户输入的内容存储成字符串类型。

1
2
3
username = input("请输入你的姓名: ")
age= input("请输入您的年龄: ")
age=int(age) # 将纯数字的字符串类型转换成为整型。
在早期的Python2中,则使用 raw_input 来进行用户输入操作。

  • 但在Python2中如果使用input,则必须要求用户输入一个明确的数据类型,输入的是什么类型,则存什么类型。

5.2 格式化输出

# 使用C语言风格的方式,值按照位置与%s一一对应。%s接收任何类型的字符串

print("My name is %s ,age is %s " %("SolerHO","25"))

# 以字典的方式传值,打破位置的限制。
print("My name is %(name)s , age is %(age)s" %{"age":"18","name":"Solerho"})

# 直接使用format方法,str.format --------- 一般推荐使用,兼容性较好
print("my name is {}, Age is {}".format("Solerho",18))
print("my name is {name}, Age is {age}".format(name="Solerho",age=18)) 

#通过key=value的方式来取值,打破位置的限制
print("my name is {}, Age is {}".format("Solerho",18)) # 
  • 使用f的方式,只在python3中才开始支持。

    • {} 内的字符串可以被当做表达式来运行。
    print(f'my name is {name}, Age is {age}')
    
  • format的新增

    1
    2
    3
    print('{x:=<10}'.format(x='starting')) # 表示左对齐
    print('{x:=>10}'.format(x='starting')) # 表示右对齐
    print('{x:=^10}'.format(x='starting')) # 表示中间对齐
    

6. 基本运算符

  • 算术运算符+、-、@(矩阵乘)、*、/(有小数)、//(取商的整数部分)、%(取余数)、**(求幂)

  • 赋值运算符

    • = 变量的赋值

    • 增量赋值,例如:a +=5 等价于 a = a + 5

    • 链式赋值:将一个值绑定到三个不同的变量

      1
      2
      3
      4
      a = 10
      b = a
      c = b
      # 以上的语句则直接使用 c = b = a = 10
      
    • 交叉赋值:通过中间变量来进行变量的交换赋值,类似比较两个数。

      x,y = y,x
      
      - 比较运算符>、>=、<、<=、==、!= - 条件可以是比较运算符,此时条件判断之后返回的是一个布尔值。

      • 可以是True、False
  • 逻辑运算符not、and、or

    • not:直接条件结果取反
    • and:逻辑与,连接左右两个条件,两个条件必须为True,才为True
    • or:逻辑或,连接左右两个条件,其中之一条件为True,则为True。

    • 区分优先级:not > and > or

    • 显式布尔值:True、False

    • 隐式布尔值:所有的数据类型,其中0,None、空(空字符串、空列表、空字典)均为False,其余均为True。

      所有的值都可以拿去当条件来使用。

      • ⚠️注意:空和空格不是同一个意思。
  • 成员运算符innot in

    • 判断是否在或者不在某个里面。

    • 在for循环中经常使用。

      1
      2
      3
      4
      print("Solerho" in "Hello Solerho") # 判断字符串是否在另一个字符串中
      
      print("Solerho" not in "Hello Solerho") # 判断字符串不在另一个字符串中,一般情况下,推荐使用,让可读性更好
      print(not "Solerho" in "Hello Solerho") # 判断字符串不在另一个字符串中
      
  • 身份运算符isis not

    • 主要是判断id是否相等。
  • 位运算符:>>、<<、&(按位与)、^(按位异或)、|(按位或)

对于Python运算符的优先级,如果区分不清楚先后,可以使用最简单和数学中一样的方式:加括号。

7. 分支控制if语句

  • 语法格式:

    1
    2
    3
    4
    5
    6
    if condition:
        code
        code
    else:
        code
        code
    
  • 对于python而言,一个缩进是4个空格(1个tab),代表属于同一个代码块,类似其他语言中的括号。

    1
    2
    3
    4
    5
    6
    age = input("请输入你的年龄")
    
    if int(age) > 18:
        print("你是一个成年人了!")
    else:
        print("你还是未成年人")
    
  • 多重嵌套

    # 进行多重判断,常见例子:打印自己的成绩等级
    if condition:
        code
        code
    elif:# else if 的缩写
        code
        code
    else:
        code
        code
    

8. 循环语句

  • while循环
  • for循环

8.1 while循环

  • while循环的语法格式:

    1
    2
    3
    4
    while condition:
        code
        code
        code
    
  • 死循环与效率问题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    tag = True
    while tag: # 如果要结束循环,则直接在下一次判断条件进入时设置为False,则会失效。
        input_name = input("please input your account : ")
        input_pwd  = input("please input your passwd")
        if input_name == username and input_pwd == password:
            print("login Successful")
            tag = False # 在循环结束后。会退出循环,从而进去登陆界面
        else:
            print("Login Failed,please check your account or password!")
    
  • break 语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    tag = True
    while tag: # 如果要结束循环,则直接在下一次判断条件进入时设置为False,则会失效。
        input_name = input("please input your account : ")
        input_pwd  = input("please input your passwd")
        if input_name == username and input_pwd == password:
            print("login Successful")
            break # 直接立即终止本层循环
        else:
            print("Login Failed,please check your account or password!")
    
  • continue 语句

    • 结束本次循环,直接进入下一次循环。在continue之后添加同级别代码毫无意义,因为永远无法执行。
    1
    2
    3
    4
    5
    6
    7
    count = 0
    while count < 6:
        if count == 4:
            count +=1 # 提前加,然后直接退出本次循环后也可以继续打印信息
            continue # 如果count==4就直接结束此次循环。
        print(count)
        count +=1
    

8.2 for循环

  • 循环就是解决重复的事情,是python提供的第二种循环机制。

  • 只要for循环可进行,也可以用while循环来实现。for循环就是为了循环取值(遍历取值)。

  • for循环的语法格式:

    1
    2
    3
    4
    5
    6
    7
    for arg in 可迭代对象: # 可迭代对象:;列表、字典、字符串、元组、集合
        code
        code
    
    # 示例:
    for arg in (1,10): # 简单的循环取值,对于循环的次数,取决于可迭代对象的个数或者范围。
        print(arg)
    
  • for循环和while循环的区别

    • 相同点:
      • 都是循环,for循环的事,while循环也可。
    • 不同点:
      • while循环:条件循环,循环次数取决于条件何时变为False
      • for循环称为取值循环,循环次数取决于in后面包含的值的个数。
  • range 语句

    • 在python2中

      range 中起始值是从0开始,如果省略起始值,则默认是0,例如range(3) 表示3次,终值是3,数学方法是: 0<=x<3 不包含3

      如果使用方式如range(1,10,2),则此时2为步长,每隔多少计算一个,类似+2。 - 在python3中

    for i in range(1,10,2): # 使用range使得范围很大时显得简洁。
        print(i)
    
  • for循环的嵌套

    • 外层循环执行一次,而内层循环则需要完整的循环结束。

    简单例子:

    1
    2
    3
    4
    for i in range(3)
        print("外层循环-----开始",i)
        for j in range(5)
            print("内层循环开始 ------"j)
    
  • for循环嵌套的经典例子

    • 打印九九乘法表

参考资料

  • Python官方文档
  • W3CSchool Python教程
  • 路飞学城Python开发视频课:B站