Chapter 01

Python程序开发注意事项

1.Python源文件通常以.py为扩展名,但这不是必须的。

2.Python程序语句默认情况是顺序执行

3.Python语言区分大小写。

4.Python程序由一条条语句构成,每条语句后不需要以;结束,但是如果带上;也不会报错,建议不带;

Python常用的转义字符

1.\t:制表位,实现对齐的功能

2.\n:换行符

3.\\:\

4.\":”

5.\':‘

6.\r:回车

注释

1.单行注释:#注释文字

2.多行注释**(不可嵌套使用)**:'''注释文字'''或者"""注释文字“”“

3.文件编码声明注释:# coding:编码(在文件开头加上编码声明,用以指定文件的编码格式)

Chapter 02 - 变量

格式化输出

  • %操作符输出:
    符号 意义 示例
    %s 输出字符串
    %d 输出整数 %06表示输出6位整数,不足的位数补0
    %f 输出浮点数 %.2f表示输出小数点后保留两位小数
    %% 输出百分号
    示例:
    1
    print("个人信息:%s %d %s %.2f"%(name,age,gender,score))
  • format()函数
    示例:
    1
    print("个人信息:{} {} {}".format(name,age,gender))
  • f-strings
    示例:
    1
    print(f"个人信息:{name} {age} {score} {gender}")

数据类型

基本数据类型

类型
整型 int
浮点数 float
布尔值 bool
字符串 string

基本介绍

1.Python中的变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
2.可以使用type()函数查看数据类型。

语法:type(object)

整数类型

  • Python的整数有十进制、十六进制、八进制、二进制。
    1.十进制。
    2.十六进制写法:加前缀0x
    3.八进制写法:加前缀0o
    4.二进制写法:加前缀0b
  • 整型占用字节:可以通过sys.getsizeof()以字节单位返回对象的大小。
    1.字节数随着数字增大而增大。
    2.每次的增量是4字节。

浮点类型

  • 浮点类型计算后,存在精度的缺失,可以使用Decimal类进行精确计算。

布尔类型

  • 布尔类型可以和其他数据类型进行比较,比如数字、字符串等。在比较时,将True视为1,False视为0。
  • 非0被视为真值,0被视为假值。

字符串

  • 使用'"包括起来,创建字符串。
  • 通过加号可以连接字符串。
  • Python不支持单字符类型,单字符在Python中也是作为一个字符串使用。
  • '''内容'''或者"""内容"""可以使字符串内容保持原样输出。
  • 在字符串前面加r可以使整个字符串不会被转义。

字符串驻留机制

  • 说明:
    Python仅保存一份相同且不可变字符串,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串仅保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量。
  • 驻留机制几种情况讨论**(在交互模式下,即cmd进入Python)
    1.字符串是由26个英文字母大小写、0-9、_组成。
    2.字符串长度为0或1时。
    3.字符串在
    编译**时进行驻留,而非运行时。
    4.[-5,256]的整数数字。
  • PyCharm对字符串进行了优化处理,不需要满足上述特殊情况。
  • 字符串驻留机制的好处:当需要值相同的字符串时,可以直接从字符串池中拿来使用,避免频繁的创建和销毁,提升效率和节约内存。
  • sys中的intern方法可以强制2个字符串指向同一个对象。

##数据类型转换

隐式类型转换

  • Python变量的类型是不固定的,会根据变量当前值在运行时决定,可以通过内置函数type(变量)来查看其类型。
  • 在运算时,数据类型会向高精度自动转换。

显式类型转换

  • 如果需要对变量数据进行类型转换,只需要将数据类型作为函数名即可。

  • 以下几个内置的函数可以完成数据类型之间的转换。函数会**返回一个新的对象/值,就是强制类型转换后的结果。

    函数 描述
    int(x[,base]) 将转换为一个整数
    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) 将一个整数转换为一个字符
  • 注意事项:
    1.不管什么值的intfloat都可以转成strstr(x)将对象x转换为字符串。
    2.int转成float会增加小数部分,float转成int会去掉小数部分。
    3.在将str类型转成基本数据类型时,要确保str值能够转成有效的数据。
    4.对一个变量进行强制类型转换,会返回一个数据/值,但强制类型转换后并不会影响原变量的数据类型(即:不会影响原变量指向的数据/值的数据类型)

Chapter 03 - 运算符

算术运算符

运算符 运算
+
-
*
/
% 取模(取余)
// 取整除(返回商的整数部分,向下取整
** 返回x的y次幂
  • 当对一个数取模时,对应的运算公式:a % b = a - a // b * b

比较运算符

运算符 运算
== 等于
!= 不等于
< 小于
> 大于
<= 小于等于
>= 大于等于
is 判断两个变量引用对象是否为同一个
is not 判断两个变量引用对象是否不同

逻辑/布尔运算符

运算符 逻辑表达式 描述
and x and y 如果x为False,则返回x的值,否则返回y的值
or x or y 如果是True,则返回x的值,否则返回y的值
not not x 如果x为True,返回False;如果x为False,返回True
  • and是种“短路运算符”,只有当第一个为True时才会去验证第二个。
  • or是种“短路运算符”,只有当第一个为False时才会去验证第二个,即如果第一个为True,就直接返回第一个的值。

赋值运算符

运算符 描述
= 简单的赋值运算符
+= 复合加法赋值运算符
-= 复合减法赋值运算符
*= 复合乘法赋值运算符
/= 复合除法赋值运算符
%= 复合取模赋值运算符
**= 复合幂赋值运算符
//= 复合取整除赋值运算符
  • 实现变量交换的简单方法:x,y = y,x

三元运算符

语法:
变量名 = a if a > b else b

  • 如果a > b成立,就把a作为整个表达式的值,并赋值给变量;如果a > b不成立,就把b作为整个表达式的值,并赋值给变量;

运算符优先级

算术运算>位运算>比较运算>逻辑运算>赋值运算

标识符

  • 标识符:各种变量、函数和类等命名时使用的字符序列。
  • 命名规范:
    函数名一律小写,如果有多个单词,用下划线隔开。私有函数以双下划线开头

键盘输入语句input()

  • 从控制台接收到的数据类型是str类型。如果希望对接收到的数据进行算术运算,则需要进行类型转换,也可以在接收数据的之后直接转成需要的类型。

    示例:
    变量名 = int(input(“…”))

Chapter 04 - 进制

位运算符

jsuaM.png jsGIx.png

Chapter 05 - 程序控制结构

顺序控制

分支控制if-else

单分支

  • 基本语法:

    if 条件表达式:
    代码块(可以有多条语句)

  • 基本语法说明:
    1.Python的缩进非常重要,是用于界定代码块的,相当于其他编程语言里的大括号{}
    2.最短的缩进对较长的有包含关系,缩进长度没有要求,但是每个代码块应具有相同的缩进长度(TAB或相同个数的空格)。

双分支

  • 基本语法:

    if 条件表达式:
    执行代码块1
    else:
    执行代码块2

多分支

  • 基本语法:

    if 条件表达式1:
    执行代码块1
    elif 条件表达式2:
    执行代码块2
    …………
    else:
    执行代码块n + 1

嵌套分支

for循环控制

  • 基本语法:

    for <变量> in <范围/序列>:
    <循环操作语句>

  • 基本语法说明:
    1.<范围/序列>可以理解要处理的数据集,需要是可迭代对象(如字符串、列表等)。
    2.Python的for循环是一种**“轮询机制”,是对指定对象的数据集进行“轮询处理”**。
  • 注意事项和细节说明:
    1.循环时,依次将序列中的值取出赋给变量。
    2.如果需要遍历数字序列,可以使用内置range()函数,它会生成数列。range()生成的数列是前闭后开
    • range(start,stop,step):
      • range默认增加的步长step为1,start默认为0。
      • 通过list()可以查看range()生成的序列包含的数据。
        3.for可以和else配合使用:当for循环正常的完成遍历,在遍历过程中没有被打断
      • 语法格式:

        for <变量> in <范围/序列>:
        <代码块1>
        else:
        <代码块2>

while循环控制

  • 基本语法:

    while 判断条件:
    循环操作语句

  • 注意事项和细节说明:
    1.while可以和else配合使用:在while...else判断条件为false时,会执行else的语句块,即:在遍历过程中,没有被打断

    语法格式:
    while 判断条件:
    循环操作语句
    else:
    其他语句

多重循环控制

break语句

  • random模块的randint()函数生成随机数,语法为:
    1
    2
    3
    import random
    ...
    random.randint(a,b)

    返回随机数N满足a <= N <= b相当于randrange(a,b + 1)

  • 注意事项和相关细节:
    1.break语句是用在forwhile循环所嵌套的代码。
    2.break会终结最近的外层循环,如果循环有可选的else子句,也会跳过该子句
    3.如果一个for循环被break所终结,该循环的控制变量会保持当前值。

continue语句

  • 说明:continue语句用于结束本次循环,继续执行循环的下一个轮次,不是退出循环

return语句

  • 基本介绍:return使用在函数,表示跳出所在的函数。
  • 说明:如果没有return语句,默认返回NoneNone是内置常量,通常用来代表空值的对象。

Chapter 06 - 函数

  • 分类:系统函数、自定义函数
  • 基本语法:

    def 函数名 (形参列表):
    函数体
    (可以return关键字设置返回值)

注意事项和使用细节

1.如果同一个文件出现函数名相同的函数,则以就近原则进行调用。(没有重载机制!!)
2.调用函数时,根据函数定义的参数位置来传递参数,这种传参方式就是位置参数,传递的实参和定义的形参顺序和个数必须一致,同时定义的形参不用指定数据类型,会根据传入的实参决定。
3.函数可以有多个返回值,返回数据类型不受限制。
示例:

1
2
3
4
5
def f(n1,n2):
return n1 + n2,n1 - n2

r1,r2 = f(10,20)
print(f"r1->{r1},r2->{r2}")

4.函数支持关键字参数:函数调用时,可以通过形参名=实参值的形式传递参数,这样可以不受参数传递顺序的限制。
示例:
1
2
3
4
5
6
7
8
def book_info(name,price,author,amount):
print(f"name=>{name},price->{price},author->{author},amount->{amount}")

#通常调用方式:一一对应
book_info("红楼梦",60,"曹雪芹",30000)

#关键字参数
book_info("红楼梦",60,amount = 6000,author = "曹雪芹")

5.参数支持默认参数/缺省参数:定义函数时,可以给参数提供默认值。调用函数时,指定了实参则以指定的为准,否则以默认值为准。默认参数需要放在参数列表后
示例:
1
2
3
4
5
def book_info(name = '<<thinking in python>>',price = 66.8,author = '龟叔',amount = 1000):
print(f"name=>{name},price->{price},author->{author},amount->{amount}")

#调用测试
book_info() book_info('<<study python>>')

补充:
1
2
def book_info(name,price,author = '龟叔',amount = 1000):	#正确
def book_info(name = '<<thinking in python>>',price = 66.8,author,amount): #错误

6.函数支持可变参数/不定长参数:

  • 应用场景:当调用函数时,不确定传入多少个实参的情况。
  • 传入的多个实参会被组成一个元组,元组可以储存多个数据项。

7.函数的可变参数/不定长参数也支持多个关键字参数。

  • 应用场景:当调用函数时,不确定传入多少个关键字参数的情况。
  • 传入的多个关键字参数会被组成一个字典,字典可以储存多个键 = 值的数据项。

8.Python调用另一个.py文件中的函数:
示例:f1.py,f2.py
f1.py

1
2
def add(x,y):
print(x + y)

f2.py文件中调用f1.pyadd函数如下:
1
2
import f1
f1.add(1,2)

函数的传参机制

  • 字符串和数值类型是不可变数据类型,当对应的变量的值发生了变化时,它对应的内存地址会发生改变。

递归调用

  • 递归的重要规则:
    1.执行一个函数时,就创建一个新的空间(栈空间)。
    2.函数的变量是独立的。
    3.递归必须向退出递归的条件逼近,否则就是无限递归。
    4.当一个函数执行完毕或者遇到return就会返回。遵守谁调用,就将结果返回给谁。

函数作为参数传递

  • 注意事项和细节:
    1.函数作为参数传递,传递的不是数据,而是业务处理逻辑
    2.一个函数,可以接收多个函数作为参数传入。

lambda匿名函数

  • 基本介绍:当需要将函数作为参数进行传递,但是这个函数只使用一次时,可以使用lambda匿名函数

定义

  • def关键字可以定义有名称的函数,可以重复使用。
  • lambda关键字可以定义匿名函数(无名称),匿名函数只能使用一次
  • 匿名函数用于临时创建一个函数,只使用一次的场景。

基本语法

lambda 形参列表: 函数体**(只能写一行代码)**

全局变量和局部变量

  • 注意事项和使用细节:
    1.在函数内部使用global关键字,可以表明指定使用全局变量。

Chapter 07 - 数据容器

  • 基本介绍:
    1.数据容器是一种数据类型。
    2.数据容器可以存放多个数据,每一个数据也被称为一个元素。
    3.存放的数据/元素可以是任意类型。

list列表

参考文档: https://docs.python.org/zh-cn/3.12/library/stdtypes.html#list

  • 基本介绍:列表可以存放多个不同类型的数据,即列表就是一列数据。列表也是一种数据类型。

  • 列表的定义:创建一个列表只需要用逗号分隔不同的数据项,使用方括号[]括起来即可。
    示例:

    1
    list = [100,200,300]
  • 列表的使用语法:(索引类比数组的下标)

    列表名[索引]

  • 列表的遍历:

    • 使用while循环完成遍历:
      示例:
      1
      2
      3
      4
      5
      6
      #得到list的元素个数:`len(列表名)`
      list = [...]
      index = 0
      while index < len(list):
      print(f"第{index + 1}个元素是:{list[index]}")
      index += 1
    • 使用for循环完成遍历:
      示例:
      1
      2
      3
      list = [...]
      for ele in list:
      print(f"元素是:{ele}")
  • 注意事项和使用细节:
    1.如果需要一个空列表,可以通过[]或者list()的方式来定义。
    2.列表的元素可以有多个,且数据类型没有限制**(也可以是列表)允许有重复元素,并且是有序的。
    3.索引也可以
    从尾部开始**,最后一个元素的索引为-1.往前一位为-2,以此类推
    4.通过列表名[索引] = 新值对数据进行更新,使用列表名.append(值)方法来添加元素,使用del语句来删除列表的元素,注意不能超出有效索引范围。
    5.列表是可变序列。

    • 列表的元素是可以修改的,修改后列表指向的地址不变**(元素的地址会发生变化)**,只是数据内容变化。
  • 列表的常用操作:

    函数 作用
    len(list) 列表元素个数
    max(list) 返回列表元素最大值
    min(list) 返回列表元素最小值
    list(seq) 将元组转换为列表
    list.append(obj) 在列表末尾添加新的对象
    list.count(obj) 统计某个元素在列表中出现的次数
    list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
    list.index(obj) 从列表中找出某个值第一个匹配向的索引位置
    list.insert(index,obj) 将对象插入列表
    list.pop([index = -1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
    list.remove(obj) 移除列表中某个值的第一个匹配项
    list.reverse() 反向列表中的元素
    list.sort(key = None,reverse = False) 对原列表进行排序
    list.clear() 清空列表
    list.copy() 复制列表
  • 列表生成式:生成列表的公式
    基本语法:

    [列表元素的表达式 for 自定义变量 in 可迭代对象]
    示例:

    1
    2
    [ele * 2 for ele in range(1,5)]
    #得到列表[2,4,6,8]