Python | 学习笔记

Python | 学习笔记

环境:Python 3.9.7

1. 简介

针对有一定开发经验快速学习Python语法。

2. 注释

# 这个是注释内容
print("hello world") # 注意print不是线程安全的

3. 基本类型

注意:

  1. 任何运算中只要有一方是浮点数,结果必然是浮点数。
  2. Python浮点数也有精度问题。

3.1. 字符串

当然也能使用\t\n...之类转义字符

# 打印message字符串
message = "hello world"
print(message)

# 字符串格式化
# 注意:需要Python 3.6以上版本
first_name = "Zhang"
last_name = "SanFeng"
full_name = f"{first_name}{last_name}"
print(full_name)

# 大写、小写、去左右空白
word = " name "
print(word.upper())
print(word.lower())
print(word.strip())

3.2. 整数

# 加(+)、减(-)、乘(*)、除(/)
num = 1 + 1
print(num)

# 乘方(**)
num2 = 10 ** 2
print(num2)  # 100

3.3. 浮点数

# 加(+)、减(-)、乘(*)、除(/)
num = 1.1 + 1.9
print(num)

# 乘方(**)
num2 = 10.5 ** 2
print(num2)

3.4. 列表

  • 与其他语言中数组相同
  • 索引从0开始
  • 索引-1表示查看最后一个元素
  • 列表与切片之间没有底层引用

创建

# 直接创建
nums = [1, 2, 3, 4]
print(nums)

# 使用range创建
# 1
# nums2 = [1, 2, 3, 4]
nums2 = list(range(1, 5))
print(nums2)

# 2
# nums3 = [1, 3]
nums3 = list(range(1, 5, 2))
print(nums3)

# 列表解析
# nums4 = [1, 4, 9, 16]
nums4 = [value ** 2 for value in range(1, 5)]
print(nums4)

nums = [1, 2, 3, 4]
# 末尾追加
nums.append(5)
# 指定位置插入insert(索引, 值)
nums.insert(5, 6)
print(nums)

nums = [1, 2, 3, 4]

# 直接删除
del nums[0]
print(nums)

# 弹出末尾元素并删除
del_num = nums.pop()
# 弹出指定元素元素并删除
del_num2 = nums.pop(1)
print(nums, del_num, del_num2)

# 根据值删除
nums.remove(2)
print(nums)

nums = [1, 2, 3, 4]
nums[0] = 99
print(nums)

nums = [1, 2, 3, 4]
# 查看第1个元素
print(nums[0])
# 查看第2个元素
print(nums[1])
# 查看最后1个元素
print(nums[-1])
# 查看列表长度
length = len(nums)
print(length)

排序

nums = [3, 1, 2, 4]

# 从小到大
nums.sort()
print(nums)

# 从大到小
nums.sort(reverse=True)
print(nums)

# 不修改原数组排序
new_nums = sorted(nums)
print(new_nums)

切片

nums = [1, 2, 3, 4]

# 切片
# nums2 =  [1, 2]
nums2 = nums[:2]
print(nums2)
# nums3 = [2, 3, 4]
nums3 = nums[1:]
print(nums3)
# nums4 = [2]
nums4 = nums[1:2]
print(nums4)

# 复制列表
# copy_nums = [1, 2, 3, 4]
copy_nums = nums[:]
print(copy_nums)

3.5. 元组

创建

nums = (1, 2, 3)

查看

nums = (1, 2, 3)

# 1
print(nums[0])

# 2

for num in nums:
    print(num)

注意:元素不能修改元素数据,但能给元组整体重新赋值。

nums = (1, 2, 3)

# error example 
nums[0] = 11

# correct example
nums = (11, 2, 3)

3.6. 字典

注意:

  • 字典中元素的排列顺序与定义时相同。
# 创建
person = {
    'name': 'Yimt',
    'age': 18,
}

# 获取
# 1.如果不存在会报错
print(person['name'])
print(person['age'])
# 2.设置不存在默认值
name = person.get('name', 'default name')
print(name)

# 添加
person["phone"] = 1234

# 删除
del person["phone"]

# 遍历键值
for k, v in person.items():
    print(k, v)

# 遍历键
for k in person.keys():
    print(k)

# 遍历值
for v in person.values():
    print(v)

# 嵌套
dic1 = {
    'a': [1, 2, 3],
    'b': {
        'c': 1,
        'd': 2
    }
}
print(dic1)

3.7. 常量

Python中没有常量

# 使用下面替代常量
MAX_AGE = 150

3.8. 通用

# 多个变量同时赋值
a, b = 1, 2
print(a, b)

# 下划线
money = 10_000
print(money)

4. 条件判断

# 基本
num = 3
if num == 1:
    print("is one")
elif num == 2:
    print("is two")
else:
    print("default")

# and
if True and True:
    print("True")

# or
if False or True:
    print("True")

# in
if 1 in [1, 2, 3]:
    print("in is True")

# not
if not False:
    print("False")

5. 循环

5.1. for

  • range(开始, 结束, 步进):range返回数据包含开始不包含结束
nums = [1, 2, 3, 4]

# 遍历列表
for num in nums:
    print(num)

# 通过range遍历
# 1~4
for num in range(1, 5):
    print(num)

# 控制range步进
# 1、3
for num in range(1, 5, 2):
    print(num)

# 倒序遍历列表
for num in range(len(nums)-1, -1, -1):
    print(num)

5.2. while

num = 0
while True:
    num += 1

    # 对2取余等于0跳过
    if num % 2 == 0:
        continue

    # 大于10停止
    if num > 10:
        break

    print(num)

6. 函数

# 普通方法定义
def sum(a, b):
    return a + b


print(sum(1, 2))

# 指定参数类型
def sum(a, b: int):
    return a + b


print(sum(1, 2))

# 可变参数
def sum(*nums):
    result = 0
    for num in nums:
        result += num

    return result


print(sum(1, 2, 3))

# 默认值
def sum(a, b = 1):
    return a + b


print(sum(1))

# 指定形参传值
def sum(a=1, b=1):
    return a + b


print(sum(b = 3))

7. 模块

tools.py

def sum(a, b):
    return a + b

7.1. 导入整个模块

hello.py

import tools

print(tools.sum(1, 2))

7.2. 导入特定函数

hello.py

from tools import sum

print(sum(1, 2))

7.3. 函数别名

hello.py

from tools import sum as s

print(s(1, 2))

7.4. 模块别名

hello.py

import tools as t

print(t.sum(1, 2))

7.5. 导入模块所有函数

hello.py

from tools import *

print(sum(1, 2))

8. 类

注意:

  • __init__方法在创建类时自动执行

8.1. 基本使用

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def sit(self):
        print(f"{self.name} is now sitting")

    def roll_over(self):
        print(f"{self.name} rolled over!")
        
# 创建实例
my_dog = Dog('Willie', 6)

# 调用方法
my_dog.sit()
my_dog.roll_over()    

8.2. 继承

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def get_name(self):
        return self.name

    def get_age(self):
        return self.age

    def print_info(self):
        print(f"name: {self.name} age: {self.age}")


class Student(Person):
    def __init__(self, name, age, school_name):
        super().__init__(name, age)
        self.school_name = school_name

    def get_school_name(self):
        return self.school_name

    def print_info(self):
        """重写父类方法"""
        print(f"name: {self.name} age: {self.age} school_name: {self.school_name}")

8.3. 抽象类

子类继承抽象类的话就必须要实现抽象类的所有抽象方法

import abc


class Animal(object, metaclass=abc.ABCMeta):
    def __init__(self, name):
        # __表示私有变量
        self.__name = name

    @abc.abstractmethod
    def introduce(self):
        pass

    def get_name(self):
        return self.__name

    @staticmethod
    def say_hello():
        print("hello")


class Dog(Animal):

    def __init__(self, name):
        # 初始化父类
        super().__init__(name)
        self.__name = name

    def eat(self):
        print(f"{self.__name} eat")

    def introduce(self):
        print("Dog")


def demo(a: Animal):
    a.introduce()
    # 君子之约
    print(f"demo = {a.get_name()}")


if __name__ == '__main__':
    dog: Animal = Dog('小明')
    dog.eat()
    demo(dog)

8.4. 类导入

person.py

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def get_name(self):
        return self.name

    def get_age(self):
        return self.age

    def print_info(self):
        print(f"name: {self.name} age: {self.age}")

hello.py

# 导入单个类
from person import Person

p = Person('Yimt', 18)
p.print_info()

# 导入多个类
# from person import Person, ClassA, ClassB...

# 导入整个模块
# import Person

# 导入模块中的所有类
# import Person import *

# 使用别名
# from person import Person as P

9. 异常处理

if __name__ == '__main__':
    try:
        # 触发除0异常
        print(5 / 0)
    except ZeroDivisionError:
        print("除数不能为0!")
    except Exception:
        print("通用异常匹配")
    else:
        # 可选项
        print("执行成功!")
    finally:
        # 可选项
        print("此处不论成功或异常都会执行!")

10. 测试

import unittest


def math_sum(a, b):
    return a + b


class MathTestCase(unittest.TestCase):
    def test_math_sum(self):
        result = math_sum(1, 2)
        # 可以修改3为4,查看错误提醒
        self.assertEqual(result, 3, msg="测试失败")

11. 多线程

11.1. 简介

Python如果想要实现多线程主要有两种方式,第一种继承threading.Thread,第二种通过回调。推荐使用继承的方式,继承方式功能更强,可以实现启动、停止、判断是否存活等状态。

11.2. 实现方式

11.2.1. threading.Thread(推荐使用)
import threading
import time


class Hello(threading.Thread):
    def __init__(self, name):
        # 注意不设置当前线程守护线程,主线程退出过后,后台线程还是继续运行程序不会退出
        threading.Thread.__init__(self, daemon=True)
        self.__name = name

    def run(self):  # 实现多线程
        count = 0

        while True:
            count += 1
            print(f"{self.__name} hello {count}")
            time.sleep(2)


if __name__ == '__main__':
    Hello('张三').start()  # 启动第一个
    time.sleep(1)  # 防止print同时打印,print不是线程安全的
    Hello('李四').start()  # 记动第二个

    time.sleep(10)
11.2.2. _thread
import _thread
import time


def hello(name):
    count = 0

    while True:
        count += 1
        print(f"{name} hello {count}")
        time.sleep(2)


if __name__ == '__main__':
    _thread.start_new_thread(hello, ('张三',))
    _thread.start_new_thread(hello, ('李四',))
    time.sleep(10)

12. 锁

import threading

if __name__ == '__main__':
    l = threading.Lock()
    l.acquire()  # 请求锁
    l.release()  # 释放锁

    # 注意: 不是读写锁意思
    rl = threading.RLock()  # 重入锁
    rl.acquire()  # 请求锁 允许同一个线程可以多次请求
    rl.release()  # 释放锁

13. 参考

  • 《Python编程从入门到实践(第2版)》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yimtcode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值