python基础_05_python基础【1】

发布时间 2023-11-28 21:36:52作者: Lea4ning

【一】注释语法

【1】什么是注释

  • 注释就是就是对代码的解释说明,注释的内容不会被当作代码运行

【2】为什么要注释

  • 增强代码的可读性

【3】如何使用注释

  • 代码注释分单行和多行注释

  • 1、单行注释用#号,可以跟在代码的正上方或者正后方

    # 这是一段通过“# + 注释内容”创造的注释代码
    
  • 2、多行注释可以用三对双引号""" """

    '''
    这是一段通过
    “三引号(```)
    注释内容1
    注释内容2”
    创造的多行注释
    '''
    

【4】代码注释的原则

  • 1、不用全部加注释,只需要为自己觉得重要或不好理解的部分加注释即可
  • 2、注释可以用中文或英文,但不要用拼音

【二】Python基础之常量和变量

【1】常量

(1)什么是常量

  • 常量就是程序运行过程中不变的变量

(2)常量的使用

  • 通常通过大写字母来声明常量,以提醒自己和其他人这个变量的值应该保持不变。

  • 在Python中尽管常量的值是可以修改的,但常量尽可能不要去修改,这样有助于提高程序员在阅读修改代码时,更加方便的理解

【2】变量

(1)什么是变量

  • 变量就是程序运行过程中可能会变化的量

(2)为什么要有变量

  • 通过使用变量,程序可以在运行时根据需要存储和修改数据,从而实现动态的状态和行为
  • 变量在程序中扮演着存储和传递信息的角色
    • 程序执行的本质就是一系列状态的变化,变是程序执行的直接体现
    • 所以我们需要有一种机制能够反映或者说是保存下来程序执行时状态,以及状态的变化

(3)变量的定义与调用

1、变量的定义

  • 由 变量名 + “=” + 变量值 三部分组成
  • 变量名相当于门牌号,由此门牌号找到变量值

2、变量的调用

  • 解释器执行到变量定义的代码时会申请内存空间存放变量值
    • 然后将变量值的内存地址绑定给变量名
    • 以变量的定义age=18为例,如下图

3、变量的命名规范

  • 原则:变量的命名应该见名知意
  • 变量名只能是 字母、数字或下划线的任意组合
  • 变量名的第一个字符不能是数字
  • 关键字不能声明为变量名,常用关键字如下
['and', 'as', 'assert', 'break', 
'class', 'continue', 'def', 'del', 
'elif', 'else', 'except', 'exec', 
'finally', 'for', 'from','global', 
'if', 'import', 'in', 'is', 'lambda', 
'not', 'or', 'pass', 'print', 
'raise', 'return', 'try', 'while', 
'with', 'yield'] 
  • 变量名的风格
    1. 驼峰体
      • 大驼峰:每个单词的首字母都大写,其余字母小写
        • AgeOfTony = 56
      • 小驼峰:每个单词的首字母都大写,只有第一个单词的首字母是小写
        • numberOfStudents = 80
    2. 纯小写下划线
      • 所有字母都小写,每个单词之间使用下划线分隔(在python中,变量名的命名推荐使用该风格)
        • age_of_tony = 56
        • number_of_students = 80

4、变量的三大特性

  • (1)id (内存地址 - 内存编号)

    • 反应的是变量在内存中的唯一编号,内存地址不同id肯定不同
    # 可以通过print(id(变量名)) 查看
    
  • (2)type (数据类型)

    • 变量值的类型
    # 可以通过print(type(变量名)) 查看
    
  • (3)value (变量值)

    • 变量值

【3】补充-PE8规范

Python注释补充之PE8规范

  • PEP是Python Enhancement Proposal的缩写,代表Python增强提案。其中第8号增强提案(PEP 8)是关于Python代码风格的指南。
  • 每个PEP都是一份技术文档,为Python社区提供指导,促使Python在不断进步。PEP 8着重于统一Python代码的风格,使其更易读、易维护,适用于多人协作开发的场景。

常用的规范标准

  • 【1】空格的使用

    • 使用空格表示缩进,不使用制表符(Tab)。
    • 每一层缩进使用4个空格。
    • 每行字符数不超过79个,多行表达式首行除外,其余行缩进4个空格。
    • 函数和类定义之间使用两个空行分隔,类中方法之间使用一个空行分隔。

    【2】标识符的命名

    • 变量、函数和属性使用小写字母,多个单词用下划线连接。
    • 类中受保护的实例属性以一个下划线开头。
    • 类中私有的实例属性以两个下划线开头。
    • 类和异常的命名每个单词首字母大写。
    • 模块级别的常量使用全大写字母,多个单词用下划线连接。
    • 类的实例方法参数命名为self,类方法参数命名为cls。

    【3】表达式和语句

    • 采用内联形式的否定词,如if a is not b
    • 避免使用检查长度的方式来判断字符串、列表是否为None或没有元素,应该使用if not x形式。
    • 即使在if分支、for循环、except异常捕获中只有一行代码,也不要将代码和关键字写在一起,分开写更清晰。
    • import语句总是放在文件开头。
    • 引入模块时,from math import sqrt优于import math
    • 多个import语句分为三部分:Python标准模块、第三方模块和自定义模块,每部分按照字母表顺序排列。

【三】Python基础之垃圾回收机制

【1】参考博客:

【5.0】Python基础之垃圾回收机制 - Chimengmeng - 博客园 (cnblogs.com)

【2】博客摘要

  • 垃圾回收机制作为python解释器自带的一种功能,其目的在于帮助系统更好的管理内存,提高程序的运行效率

    • 垃圾回收机制,用来回收不可用的变量值所占用的内存空间(在内存中,没有变量名指向的数据都是垃圾数据)

    • 垃圾回收机制,引用计数为主,垃圾回收、分代回收为辅。

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

    • 在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用的问题,并且通过“分代回收”(generation collection)以空间换取时间的方式来进一步提高垃圾回收的效率。
  • 一个变量值可以有多个变量名指向,有一个变量名指向,引用计数就是1,有两个就是2

    • 只要引用计数不为0,这个变量值就不是垃圾数据,当引用计数为0了,说明这个变量值就没用了,就可以清除了
一个变量名只能指向一个内存空间: 意味着一个变量名在某一时刻只能代表一个值。当你给一个变量赋新值时,它将指向新的内存空间,不再指向之前的。

一个内存空间可以被多个变量名指向: 多个变量名可以同时指向相同的内存空间。这意味着如果你改变了这个内存空间的值,所有指向它的变量都会受到影响。
  • 较为复杂的底层机制,个人认为知晓操作逻辑即可

【四】Python基本数据类型

【1、2】数字类型(int / float)

(1)整数类型(int)

1、作用

  • 整数类型用于表示整数,是一种基本的数字类型,广泛用于表示计数、索引等整数值。

2、定义

# 整数类型的定义是直接赋予一个整数值
int_1 = 18
int_2 = 6
print(type(int_1))   # <class 'int'>
print(type(int_2))   # <class 'int'>

3、使用

  • 数字类型【包含整数类型int和浮点数类型float】可以参与各种数学运算,包括加法、减法、乘法、除法等。

(2)浮点类型(float)

1、作用

  • 浮点类型用于表示带有小数部分的数值,适用于需要更精确表示的情况。

2、定义

# 浮点类型的定义是赋予变量值含小数点的数字
float_1 = 18.0
float_2 = 6.0
print(type(float_1))   # <class 'float'>
print(type(float_2))   # <class 'float'>

3、使用

  • 浮点类型同样可以参与各种数学运算,也可以与整数类型进行混合运算
int_1 = 2
float_1 = 2.5
print(int_1 + float_1)   # 4.5
print(int_1 - float_1)   # -0.5
print(int_1 * float_1)   # 5
print(int_1 / float_1)   # 0.8  除法为反斜杠

(3)数字类型的应用

  1. 数字运算,上述作出了举例,不再叙述

  2. 比较大小

    1. 我们可以使用比较运算符(如<><=>=)来比较数字的大小,得到布尔类型的结果

    2. a = 5
      b = 2
      compare_result = a > b
      
      # 结果为True
      print(compare_result)  # True
      print(type(compare_result))  # <class 'bool'>
      

【3】字符串类型(str)

(1)作用

  • 字符串类型用于表示文本信息,是一种非常重要的数据类型,用于处理文字、字符等信息

(2)定义

1、定义

  • 字符串可以使用单引号、双引号或三引号进行定义用引号引起来的部分就是对应变量的值(字符串类型),并且对于变量名的值
    • 用单引号、双引号、多引号,都可以定义字符串
    • 本质上是没有区别的(这些引号定义字符串的方式是等价的)
# 定义方式1:
name_1 = 'str'
# 定义方式2:
name_2 = "str"
# 定义方式3:
name_3 = '''str'''
# 定义方式4:
name_4 = """str"""
  • 通过三引号(单引号或双引号)可以定义多行字符串,方便表示包含换行的文本内容
msg_1 = '''
这是
多行
字符串
'''

2、引号嵌套问题

  • 引号需要成对出现,相同的引号与其对应的引号功能需一致
true_msg = '''这是一个测试的'语句',
三引号作为定义"字符串(str)"的符号,
'单引号'和"双引号"仅仅只是作为引号来使用'''
# 以下为输出内容
'''
这是一个测试的'语句',
三引号作为定义"字符串(str)"的符号,
'单引号'和"双引号"仅仅只是作为引号来使用
'''

# 以下为错误示范
false_msg = '这是一个错误的示范,'单引号'作为定义字符串(str)的符号,却错误地用在了"引号"上,并且引号也是可以互相出现的'
# SyntaxError: invalid syntax

(3)使用

1、运算

  • 字符串也是可以进行运算的,不过只有“相加”和“相乘”

    • 相加就是简单的字符串拼接

      str_1 = 'nice'
      str_2 = 'day'
      print(str_1 + str_2)  # niceday 无空格
      
    • 相乘就是重复字符串

      str_1 = 'nice'
      print(str_1 * 3)   #nicenicenice
      

2、索引取值

  • 字符串属于序列类型,所谓序列,指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们。

  • Python 还支持索引值是负数,此类索引是从右向左计数,换句话说,从最后一个元素开始计数,从索引值 -1 开始,如图 所示。

3、格式化输出

%输出
  • 使用 % 运算符进行格式化输出,可以在字符串中插入占位符,然后通过 % 运算符传入相应的值

    print("this is a %s day." % 'nice')   # this is a nice day.
    
  • 补充:%s%d 是占位符,分别表示字符串和整数,%s包含了%d,所以常用%s就可以了

format输出
  • 使用 format 方法进行格式化输出,通过花括号 {} 表示占位符,然后调用 format 方法传入实际值,它会按顺序依次填充传入 format 方法的值

    print("this is a {} day.".format('nice'))   # this is a nice day. 
    # 直接输入值
    print("this is a {} day. Let's {} !".format('nice','go'))   # this is a nice day. Let's go !
    # 多个值,按顺序输入
    print("this is a {1} file. Let's {2}.".format(0,'text','go'))
    # this is a text file. Let's go.
    # 根据索引输入值
    print("this is a {a} file. Let's {b}.".format(a='text', b='go'))   # this is a text file. Let's go.
    #根据键(key)索引输入
    
f + {} 输出
  • 通过在字符串前加上 fF 前缀,然后在字符串中使用 {} 表示占位符,并在 {} 中直接引用变量

    str_1 = 'nice'
    str_2 = 'go'
    print(f"this is a {str_1}. Let's {str_2}.")
    # this is a nice. Let's go.
    
补充:
  • 在字符串中,转义字符用于表示一些特殊字符或执行一些特殊操作,常用的转义字符如下:
转义字符 说明
\n 换行符,将光标位置移到下一行开头。
\r 回车符,将光标位置移到本行开头。
\t 水平制表符,也即 Tab 键,一般相当于四个空格。
\a 蜂鸣器响铃。注意不是喇叭发声,现在的计算机很多都不带蜂鸣器了,所以响铃不一定有效。
\b 退格(Backspace),将光标位置移到前一列。
\ 反斜线
' 单引号
" 双引号
\ 在字符串行尾的续行符,即一行未完,转到下一行继续写。
# 换行符
print("Hello\nWorld")
# Hello
# World

# 制表符
print("Name\tAge")
# Name    Age

# 反斜线
print("This is a backslash: \\")
# This is a backslash: \

# 单引号
print("I'm a programmer.")
# I'm a programmer.

# 双引号
print("He said, \"Hello.\"")
# He said, "Hello."

# 回车符与退格符
print("One\rTwo\bThree")
# Two Three

【4】列表类型(list)

(1)定义

  • 列表类型就是专门用来记录多个同种属性的值(比如同一个班级多个学生的姓名、同一个人的多个爱好等),并且存取都十分方便
list_1 = [1, 2, 3]  # 可以存放整数类型
list_2 = ['a', 'b', 'c']  # 可以存放字符串类型
list_3 = [1, '2', 3, 'abc']  # 可以存放多种类型
list_4 = [1, 2, 3[4, 5]]  # 可以多层列表嵌套
list_5 = [1, 2, 3, [4, 5],{'a':1,'b':2}]   # 可以嵌套字典

(2)索引

  • 列表类型是用索引来对应值,索引代表的是数据的位置,从0开始计数
list_5 = [1, 2, 3, [4, 5],{'a':'good','b':'cool'}]
# 输出为1
print(list_5[0])
# 输出为5
print(list_5[3][1])
# 输出为good
print(list_5[4]['a'])

【5】字典类型(dict)

(1)概念

  • 字典类型通过key : value形式来存储数据

    • 其中key可以对value有描述性功能(类似变量名指变量值)

    • 大括号{}括起来,内部可以存放多个元素,元素与元素之间使用逗号隔开,是以 K:V 键值对(成对出现)的形式存储

  • 字典不能通过索引取值,只能通过字典的K取值

(2)实例

dict_1 = {'a': 1 ,'b': 2, 'c':3 }
print(dict_1['a']) # 1
print(dict_1[1])   # KeyError: 1 无法通过索引值来查找

(3)嵌套练习

info = {
    'name': 'Lea4ning',
    'addr': {
        '国家': '中国',
        'info': [666, 999, {'编号': 466722, 'hobby': ['read', 'badminton', 'music']}]
    }
}
# lea4ning
print(info['name'])
# 中国
print(info['addr']['国家'])
# 幸运数字666
print(info['addr']['info'][0])
# 编号
print(info['addr']['info'][2]['编号'])
# badminton
print(info['addr']['info'][2]['hobby'][1])

# Lea4ning
# 中国
# 666
# 466722
# badminton

【6】布尔类型(bool)

(1)概念

  • 布尔类型用于表示逻辑值,只有两个取值:True(真) 和 False(假)。在 Python 中,首字母必须大写。
  • 在编程中,布尔类型经常用于控制程序的流程,例如条件判断、循环等。
  • 布尔值的命名规范:结果可能是布尔值的情况,我们都采用 is 开头 命名

(2)实例

is_true = True
if is_true:
    print('Have a nice day!')
else:
    print('Cheer up!')
# Have a nice day!


is_false = False
if is_false:
    print('Have a nice day!')
else:
    print('Cheer up!')
# Cheer up!

补充

  1. “假”的情况(False)

    • 数字零:数字类型中,整数或浮点数中的零被视为假

      is_false = 0   # 0 or 0.0 均为假
      if is_false:
          print('Have a nice day!')
      else:
          print('Cheer up!')
      # Cheer up!
      
    • 空字符串:''

      is_false = ''
      if is_false:
          print('Have a nice day!')
      else:
          print('Cheer up!')
      # Cheer up!
      
    • 空列表、空字典、空集合等:对于容器类型,如果它们为空,则视为假(False)

  2. “真”的情况(True)

    • 非零的数字类型(int/float)
    • 非空字符串' ',此处含一个空格也为真(True)
    • 非空列表、非空字典、非空集合等

【7】元祖类型(tuple)

(1)概念

  • 元组(tuple)是一种不可变的序列类型,类似于列表,用于存储多个有序元素。
  • 元组与列表的主要区别在于元组的元素不能被修改、删除或添加,是不可变的数据类型。
  • 元组通过小括号 () 定义,其中的元素可以是不同的数据类型,用逗号 , 分隔。
  • 可以使用索引访问元组的元素。

(2)使用

1、元组的不可变性

  • 元组是不可变的,不能对元素进行修改、删除或添加。

    tup_1 = (1,2,3)
    tup_1[2] = 4
    # 此处为修改`tup_1[2]`也就是3的值改为4,因为不可修改,故报错
    # TypeError: 'tuple' object does not support item assignment
    del tup_1[0]
    # 此处为删除`tup_1[0]`也就是1的值,不可修改,故报错
    # TypeError: 'tuple' object does not support item assignment
    

2、元组的基本操作

  • 元组与字符串类似,下标索引从 0 开始,可以进行截取,组合等

    tup1 = (12, 34.56)
    tup2 = ('abc', 'xyz')
    
    # 组合
    
    ## 创建一个新的元组
    tup3 = tup1 + tup2
    print (tup3)    # (12, 34.56, 'abc', 'xyz')
    
  • 截取

    • 取头不取尾
    • tup3 =(12, 34.56, 'abc', 'xyz')
Python 表达式 结果 描述
tup3[1] 34.56 读取第二个元素
tup3[-2] abc 反向读取,读取倒数第二个元素
tup3[1:] (34.56, 'abc', 'xyz') 截取元素,从第二个开始后的所有元素。
tup3[1:3] (34.56, 'abc') 截取元素,从第二个开始到第四个元素(索引为 3)。

元组补充

  • 元组中只包含一个元素时,需要在元素后面添加逗号 , ,否则括号会被当作运算符使用:
tup1 = 'lea4ning'
tup2 = ('lea4ning')
tup3 = 'lea4ning' ,
print(type(tup1))   # <class 'str'>
print(type(tup2))   # <class 'str'>
print(type(tup3))   # <class 'tuple'>
  • 元组解包

    tup1 = ('a', 'b', 3, 4, 5)
    a, b, c, d, e = tup1
    for x in [a, b, c, d, e]:    # for循环,遍历上述几个变量,读取赋值
        print(x)
    # a b 3 4 5
    

【8】集合类型(set)

(1)概念

  • 集合(set)是一个无序的不重复元素序列。

  • 集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。

  • 可以使用大括号 { } 创建集合,元素之间用逗号 , 分隔, 或者也可以使用 set() 函数创建集合。

    set1 = {1,2,3,4,5}
    set2 = set([1,2,3])
    print(set2)    # {1, 2, 3}
    print(type(set1))    # <class 'set'>
    print(type(set2))    # <class 'set'>
    

(2)使用

1、基本操作

  • 集合支持基本的操作,如添加元素、删除元素等

    # 添加元素
    # 【1】集合.add(添加的内容)    .add只能添加单个元素
    set1 = {1,2,3,'a','b'}
    set1.add('c',5)
    print(set1)    # TypeError: set.add() takes exactly one argument (2 given)
    # 【2】集合.update(添加的内容)    .update可以同时添加多个元素
    set1 = {1,'a'}
    set1.update("b",'c',[2,3],{'e','f'})
    print(set1)    # {1, 2, 3, 'b', 'f', 'a', 'e', 'c'}
    '''貌似不可以添加数字类型
    TypeError: 'int' object is not iterable'''
    
  • 集合运算,如并集∪,交集∩,差集等

    set_a = {1, 2, 3, 4}
    set_b = {3, 4, 5, 6}
    
    # 并集
    union_set = set_a.union(set_b)
    print(union_set)    # {1, 2, 3, 4, 5, 6}
    # 交集
    intersection_set = set_a.intersection(set_b)
    print(intersection_set)    # {3, 4}
    # 差集
    difference_set = set_a.difference(set_b)
    print(difference_set)    # {1, 2}
    
  • 集合中的元素是不可重复的,即相同的元素不会重复存储。

    set1 = {1,2,3,4}
    set1.add(2)
    print(set1)    # {1, 2, 3, 4}