python入门基础笔记

212 阅读9分钟

前置知识

  • python中一切皆对象
    • 对象具有标准数据类型、属性(attribute)和方法(method或函数(function)
  • 标准数据类型
    • 数字 Number
    • 字符串 String
    • 列表 List
    • 字典 Dictionary
    • 元祖 Tuple
    • 集合 Set

数据类型

1. Number

  • 整数(int):3, -12
  • 浮点数(float):0.1, 0.2
    • 精确度问题(计算机浮点数求和通病) 截屏2023-08-20 17.02.09.png
      • 如何解决:round(0.1+0.2, 1) 截屏2023-08-20 17.03.03.png

1.1 基本运算

加、减、乘、除、乘方、求余
(注意:8/2=4.0, 8//2=4)

截屏2023-08-20 17.06.09.png

2. String

  • 字符串是各种字符:比如字母、数字、标点符号等;
  • 要用引号(单双都可)包裹,引号不会显示
    • 如果不用引号包裹,会被认为是变量名;

截屏2023-08-20 17.12.16.png

2.1 转义字符

当需要再字符串中使用转义字符时,Python中用反斜杠\表示

a = 'I\'m Chinese'
print(a)
// => I'm Chinese

什么意思呢,"'" 告诉编译器,\后的字符只把它当成一个英文字符就好。如果不加转义字符()会报错,因为编译器会认为

截屏2023-08-20 17.17.38.png

2.2 拼接字符串

截屏2023-08-20 17.21.59.png
⚠️需要注意:用+拼接会占用内存,因为string是不可变对象,每次+都会产生一个新的变量。

2.3 格式化字符串【实用】

python-fstring 可以理解为前端的`${}`
举个例子:

    name = 'dolores'
    gender = 'female'
    age = 22
    print(f"{name} is a {gender}, she is {age} years old")
    // => dolores is a female, she is 22 years old

截屏2023-08-20 17.37.44.png

2.4 索引(index)【重要】

定位一个物体位置

    a = 'hello'
    print(a[0], a[-5], a[-1])
    // => h h o
    
  • 第一个字母是h,最后一个是o
  • 从零开始
  • h的索引index是0或-5
  • o的索引index是4或-1

选取字符串中某几个连续字符 a[start:end] 截屏2023-08-20 17.58.27.png

3. List

一个列表list可以由多个数据类型的元素组成

    list1 = [1, 2, 3]
    list2 = [1, 'age', 1.1]

3.1 查询元素

  • 通过索引index查询(和字符串用法是一样的) 截屏2023-08-20 18.02.01.png 截屏2023-08-20 18.03.49.png

3.2 修改元素

直接用索引修改 截屏2023-08-20 18.05.51.png

3.3 添加元素

  • append方法 list_name.append(element)
    • 在列表最后添加一个元素,添加的元素( element )可以是一个字符串、整数、元组或其他列表。
    • 列表长度增加1 截屏2023-08-20 18.12.07.png
  • insert方法 list_name.insert(index, element)
    • 这个方法可以用来在任何需要的位置插入一个值。它需要两个参数—元素和要插入的元素的索引。
    • 列表长度增加1

截屏2023-08-20 18.14.48.png

截屏2023-08-20 18.15.41.png

  • extend方法 list_name.extend(iterable)
    • extend方法将迭代器(元组、字符串或列表)中的每个元素附加到列表的末尾。
    • 列表长度增加为迭代器中元素数量
    • ⚠️注意:迭代器是将需添加元素平铺添加

截屏2023-08-20 18.22.09.png ⚠️append, insert, extend添加方法的比较

3.4 删除元素

  • pop方法 list_name.pop() | list_name.pop(index)
    • 默认删除最后一项
    • 返回被删除项的值

截屏2023-08-20 18.28.12.png

*. function函数

如何声明函数?

    def function_name():
        do sth here    
    function_name() # 执行函数

截屏2023-08-20 22.21.57.png

4. 字典 dictionary

字典名 = {'key': value, 'key': value}
我把它理解为键值对,键与值构成字典。 -> 很像JSON

4.1 增删改(借助键名)

  • 创建一个字典
  • 增加一个键值对(默认增加到末尾)
  • 修改某个键的值

截屏2023-08-21 11.14.57.png

  • 删除某个键值对(del语句)

截屏2023-08-21 11.16.55.png

5. 元组 tuple(不修改)

  • 元组是一种不可变序列类型,类似于列表
  • 元组用小括号包裹(可省略)截屏2023-08-21 11.27.41.png
  • 用逗号相隔,若元组中只有一个元素,该元素后逗号不可省略(t = 1,)截屏2023-08-21 11.26.28.png

5.1 操作元组

  • 创建一个元组
    • tuple函数: tuple([ele1, ele2])参数iterable是可迭代对象(字段、字符串、元组、集合等)
    • (元素1, 元素2, ...):括号可省略
  • 拼接创建一个新元组 截屏2023-08-21 11.41.04.png
  • 通过序列index访问截屏2023-08-21 11.46.17.png
  • 不支持修改某一项或删除某一项,可以理解为一个元组创建后不可变截屏2023-08-21 11.44.25.png
    • 但可以删除整个元组(del语句)截屏2023-08-21 11.47.28.png

5.2 元组拆包

创建元组时,将多个元素放入一个元组叫做打包;将元组中的元素取出赋值给不同的变量的过程叫做拆包。 截屏2023-08-21 12.20.11.png

⚠️:突然想到元组的实际用处:可以用来保存私有变量

6. 集合 set

  • 可迭代、无序的、不能包含重复变量的容器数据类型。

6.1 操作集合

  • 创建一个集合
    • set(iterable)函数:set('ele1', ele2)参数iterable是可迭代对象(字段、字符串、元组、集合等);创建一个空集合,必须用set()函数,因为{}是创建一个空字典。
    • {ele1, ele2, ...}

截屏2023-08-21 12.42.50.png

  • 添加元素 如果添加的元素已经存在,则不进行操作。

    • add():只可以添加不可变元素:比如数字、字符串、元组等;添加的元素整体。截屏2023-08-21 15.24.17.png
    • update():可添加可迭代的元素:比如字符串、字典、元组等;添加数字类型会报错;会将元素拆分再添加。截屏2023-08-21 15.25.18.png
  • 删除元素

    • remove():如果元素不存在会报错;截屏2023-08-21 15.35.48.png
    • discard():如果元素不存在不会报错;截屏2023-08-21 15.36.59.png
    • pop():任意删除一个元素,并返回被删除元素;截屏2023-08-21 15.38.15.png
    • clear():清空目标集合;截屏2023-08-21 15.39.23.png
  • 查看目标元素是否在一个集合中

    • in:是否存在,返回Ture或False;截屏2023-08-21 15.40.51.png
    • not in:是否不存在, 返回False或Ture;截屏2023-08-21 15.42.11.png

条件控制

1. if-elif-else

使用前提是,我知道变量都有哪些,来写不同的执行条件。 截屏2023-08-21 16.33.59.png

2. while

只关注我们设置的执行条件,如果满足就一直执行

    while 条件
        do something
        # 需要一个跳出循环的运算
    # 通常不会这么简单,更多情况,是我们将条件设置为一个Flag,在while里面写逻辑

举个例子~ 截屏2023-08-21 16.58.50.png

3. match...case(类似于switch...case)

  • case _ :类似于switch...case中的default
  • 无需使用break跳出语句,一旦有match匹配成功,就会结束语句

截屏2023-08-21 17.10.21.png

for循环语句

循环列表

截屏2023-08-21 17.30.04.png

range()

range(stop)
range(start, stop[, step])
# start:默认为0,从0开始
# step步长:默认为1
  • range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表。
  • list() 函数是对象迭代器,可以把 range() 返回的可迭代对象转为一个列表,返回的变量类型为列表。

截屏2023-08-21 17.46.02.png 截屏2023-08-21 17.46.21.png

常见用法

  • 生成一个数组
    • list()方法:截屏2023-08-21 17.55.56.png
    • list拆分(for循环)【常见】:截屏2023-08-21 17.59.33.png

装饰器 decorator

菜鸟教程解释---简单地说:他们是修改其他函数的功能的函数

我目前理解的作用是:如果有一个或多个行为在很多方法或类里都重复使用,那么我们可以把重复的部分提取出来作为一个装饰器

举个例子~

# 装饰器

# 我们要在网站里加入安全校验,这个安全校验会在登陆、和抢票的时候都进行
# 如果我们不用装饰器,看看要怎么实现

# 登陆
def rollIn():
    username = input('请输入您的用户名:')
    password = input('请输入您的密码:')
    if (not(username) or not(password)):
        return '用户名或密码不能为空'
    else:
        # 安全校验,先简单写一个哦,不要当真,正常安全校验不会是这样的
        print('进行安全校验')
        answer = input('谁是这个世界上最美的人?')
        if (answer == '张小美'):
            return ('校验通过!欢迎登岛')
        else:
            return ('校验失败!!回去重新准备!')

# 抢票
def grabVote():
    print('正在为您抢票')
    print('进行安全校验')
    answer = input('谁是这个世界上最美的人?')
    if (answer == '张小美'):
        return ('校验通过!欢迎登岛')
    else:
        return ('校验失败!!回去重新准备!')

print(grabVote())

很明显安全校验的部分是一直在重复的,并且代码逻辑也一样,那么我们抽出作为装饰器看看,要怎么写?

# 用装饰器实现安全校验的部分
# 安全校验

def check(func): # func 是我们要装饰的方法,也可以理解为我们要对这个方法下手了!
    def wrapper(): # 定义一个包装方法
        
        print('开始安全校验')
        answer = input('谁是这个世界上最美的人?')
        if (answer == '张小美'):
            print('校验通过!')
            func()
        else:
            print('校验失败!!回去重新准备!')
    return wrapper

@check
def rollIn():
    username = input('请输入您的用户名:')
    password = input('请输入您的密码:')
    if (not(username) or not(password)):
        print('用户名或密码不能为空')
        return
    else:
        print(f'欢迎{username},登陆成功')

@check       
def grabVote():
    print('正在为您抢票')
    print('进行安全校验')
    

rollIn()

截屏2023-08-23 17.31.35.png

Class

用来描述具有相同的属性方法的对象的集合。

它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

我们来声明一个类

  • class ClassName:class语句声明一个类,类名需要首字母大写;
  • def __init__(self, attr1, ..):每一个类都需要有__init__方法,称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法;
  • self: 表示类的实例,定义方法时必须有,也可以叫别的,that都可以。
    • 当我们创建一个新的实例时 stu1 = Student,此时的stu1即为self。

举个例子~ 截屏2023-08-24 18.21.08.png

  • 解释一下stu1.outStuCount()做了什么,其实是执行了Student.outStuCount(stu1),因为stu1 = Student('ZJX', 'female')其实就是创建了stu1实例,self就是stu1,即stu1是根据Student这个类,实例化出来的具体实例。
  • 记录一个我犯的小错误:一开始我把输出的stu1.outStuCount()写成了print(stu1.outStuCount()),控制台输出的结果如下:

为什么会这样,多输出一个None,原因是: 当我们调用print(stu1.outStuCount())时,其实进行了两次print()调用,第一次是在outSuCount函数内部,然后我们在打印outSuCount函数的结果,由于outSuCount函数没有返回任何内容,即没有return,因为隐式返回了None。 截屏2023-08-24 18.25.33.png

⚠️注意 :所有未显式返回值的函数最终都隐式返回 None。

1. Python的基础内置类属性

截屏2023-08-24 18.37.23.png

2. 类属性(class attribute)和实例属性(instance attribute)【重点】

截屏2023-08-24 18.47.32.png 在我们这个例子里面,Students就是类属性,stu1和stu2就是实例属性。

类变量和实例变量

  • 实例变量 截屏2023-08-24 18.51.44.png 看一下为什么Students.stuInfo()会报错,还记得我们在声明stuInfo(self)时,传入的self属性么,self我们之前提到过,表示的实例而不是类,这也就可以解释为什么Students.stuInfo()会报错了,因为Students是类;同理Students.name也一样会报错,因为name是实例的属性,不是类的属性。

如何让一个方法既是类方法也是实例方法呢,这里需要介绍@classmethod这个装饰器。用法很简单:截屏2023-08-24 19.05.30.png

  • 共有变量 截屏2023-08-24 18.58.44.png

模块 module

Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。

引入模块

截屏2023-08-24 19.29.58.png