Python

Posted Mr.zhou_Zxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python相关的知识,希望对你有一定的参考价值。

Python

第一章:

1.常见输出:

# Author : zxy
# Date : 2022/5/2 11:50
# 1.输出数字
print(520)
# 2.输出字符串1
print('hello world')
# 2.输出字符串2
print("hello world")
# 3.输出结果到文件
# 不存在即创建 存在即追加
fp = open('F:/text.txt','a+')
print('hello world',file=fp)
fp.close()
# 4.不换行输出
print('hello','world','python')

2.转义字符

# Author : zxy
# Date : 2022/5/2 12:12

# 转义字符-换行
print('hello\\nworld')

# 转义字符-table键
print('hello\\tpython')

# 转义字符-backspace
print('hello\\bzxy')

# 转移字符-return
print('hello\\rworld')

# 转义字符-\\" \\'
print("\\"hello\\"","\\'world\\'")

# 转义字符-\\\\
print("http:\\\\\\\\www.baidu.com")

# 原字符-不希望字符串中的转义字符起作用,就使用原字符,就是在字符串前加上r或者R
print(r"http:\\\\www.baidu.com")
# 原字符使用-末尾不能使用一个反斜杠结尾会报错,需要的话,使用两个
# print(r"http:\\\\www.baidu.com\\")
print(r"http:\\\\www.baidu.com","\\b\\\\")

第二章:

1.注释

# coding:utf-8
# Author : zxy
# Date : 2022/5/2 19:09

# Python代码中的注释
# 注释:
#   提高代码可读性
#   注释内容会被Python解释器忽略
#   三种注释类型:
#       单行注释:以#开头
"""
多行注释:将一对三引号之间代码称为多行注释
"""
#       中文编码声明注释:文件开头加上中文声明注释,用以指定源码文件的编码格式

2.标识符

# Author : zxy
# Date : 2022/5/2 15:07

import keyword

# 查看所有保留字
print(keyword.kwlist)

# 标识符规则
# 变量、函数、类、模块和其他对象起的名字就叫标识符
# 规则:
#   1.字母、数字、下划线
#   2.不能以数字开头
#   3.不能是保留字
#   4.严格区分大小写

3.变量

# Author : zxy
# Date : 2022/5/2 15:13

name = 'zxy'
print(name)
print('标识',id(name))
print('类型',type(name))
print('值',name)

# 再次赋值后,会开辟新的内存空间
name = 'python'
print(name)

4.数据类型

# Author : zxy
# Date : 2022/5/2 18:22
from decimal import Decimal
# 数据类型
# 1.整数类型 int
#   1.1 可以表示正数、负数、0
n1 = 100
n2 = -100
n3 = 0
print(n1,type(n1))
print(n2,type(n2))
print(n3,type(n3))
#   1.2 整数可以表示 为二进制 十进制 八进制 十六进制
#   1.2.1 二进制取值[0,1],逢2进一
print('二进制',0b10101111)
#   1.2.2 十进制取值[0,1,2,3,4,5,6,7,8,9] 逢10进一
print('十进制',118)
#   1.2.3 八进制取值[0,1,2,3,4,5,6,7] 逢8进一
print('八进制',0o176)
#   1.2.4 十六进制取值[0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F] 逢16进一
print('十六进制',0x1EAF)
# 2.浮点数类型 float
f1 = 1.1
f2 = 2.2
#   输出结果3.3000000000000003,因为是通过二进制计算,存在浮点数小数点不准确性
print(f1,type(f1))
print(f1 + f2)
print(Decimal('1.1') + Decimal('2.2'))
# 3.布尔类型 bool
#   3.1 布尔判断
b1 = False
b2 = True
print(b1,type(b1))
if(b1) :
  print('true')
else :
  print('false')
#   3.2布尔相加
print(b1 + 1) # b1为false相当于0
print(b2 + 0) # b2为true相当于1
# 4.字符串类型 str
#   4.1 单引号,必须在一行
print('hello world',type('hello world'))
#   4.2 双引号,必须在一行
print("hello world",type("hello world"))
#   4.3 三引号,可以不在一行
print("""
        hello 
        world
        python
    """)
# 4.不同数据类型连接,使用str将int类型转成string类型
print('------------------------str()转换类型--------------------------')
name = '张三'
age = 28
print('我是'+name+',我今年'+str(age)+'岁了')
print('------------------------int()转换类型--------------------------')
s1 = '128'
s2 = True
s3 = 98.8
s4 = '98.8'
s5 = 'hello'
print(s1,type(s1),int(s1),type(int(s1)))
print(s2,type(s2),int(s2),type(int(s2)))
# float转成int,会将小数截取掉
# 将s4转成Int类型会报错,因为字符串为小数串
# 将s5转成int类型也会报错,因为字符串转成整数,该字符串必须为整数数字串
print(s3,type(s3),int(s3),type(int(s3)))

print('------------------------float()转换类型--------------------------')
s1 = '98.8'
s2 = '98'
s3 = True
s4 = 98
s5 = 'hello'
# 将s5转成float类型会失败,只允许为数字串(整数,浮点数)
print(s1,type(s1),float(s1),type(float(s1)))
print(s2,type(s2),float(s2),type(float(s2)))
print(s3,type(s3),float(s3),type(float(s3)))
print(s4,type(s4),float(s4),type(float(s4)))

5.字符编码

# Author : zxy
# Date : 2022/5/2 14:26

# 十进制
print(ord('乘'))

# 二进制
print(chr(0b100111001011000))

第三章

1.基础运算符

# Author : zxy
# Date : 2022/5/2 19:51

# 算术运算符 -> 位运算符 -> 比较运算符 -> 布尔运算符 -> 赋值运算符
# ** -> [*,/,//,%] -> [<<,>>] -> [&] -> [|] -> [>,<,<=,>=,==,!=] -> and -> or -> =

# 基础运算符
print(1+1) # 加法运算
print(1-1) # 减法运算
print(1*2) # 乘法运算
print(1/2) # 除法运算
print(11//2) # 整除运算符
print(11%2) # 取余运算符
print(2**2) # 2的2次方


print(9//4) # 2
print(-9//-4) # 2

# 一正一负取整
print(9//-4) # -3 向下取整
print(-9//4) # -3 向下取整

# 一正一负,取余
print(9%-4) # 商-3 公式:余数 = 被除数 - 除数 * 商  9 - (-4) * (-3) = 9 - 12 = -3
print(-9%4) # 商-3 公式:余数 = 被除数 - 除数 * 商  -9 - 4 * (-3) = -9 + 12 = 3

2.比较运算符

# Author : zxy
# Date : 2022/5/2 20:25
# 比较运算符
a,b = 10,20
print('a>b?',a>b)
print('a<b?',a<b)
print('a>=b?',a>=b)
print('a<=b?',a<=b)
print('a==b?',a==b)
print('a!=b?',a!=b)
"""
    赋值运算符 =
    比较运算符 ==
    一个变量由三个部分组成,标识,类型,值
    == 比较的是值
    is 比较的是标识
"""
print('----------整数对比----------')
a = 10
b = 10
print('值比较',a == b)
print('id标识比较',a is b)
print('id标识比较',a is not b)
print('---------数组对比,值相同,id标识不同-----------')
a = [1,2,3,4]
b = [1,2,3,4]
print('值比较',a == b)
print('id标识比较',a is b)
print('id标识比较',a is not b)


3.赋值运算符

# Author : zxy
# Date : 2022/5/2 20:10

# 赋值运算符
# 执行顺序 : 从右至左
a = 1 + 2
print('从右至左,先执行加法再赋值',a)
# 支持链式赋值,执行同一空间 :a = b = c = 10
a = b = c = 10
print(a,id(a))
print(b,id(b))
print(c,id(c))
# 支持参数赋值 :+= =+ *= /= //= %=
a = 20
a += 30
print('-------------a+=30 类似于 a = a + 30------------------')
print(a)
# 支持系列解包赋值 : a,b,c = 20,30,40
print('-------------解包赋值------------')
a,b = 20,30
print(a,id(a))
print(b,id(b))
print('----------交换----------------')
a,b = b,a
print(a,id(a))
print(b,id(b))

4.布尔运算符

# Author : zxy
# Date : 2022/5/2 21:12

# 布尔运算符 and or not in not in
a,b = 10,20
# and 全真为真 一假为假
print(a==10 and b == 10)
# or 全假为假 一真为真
print(a==10 or b==10)
# not 取反
b1 = True
print(not b1)
# in
s1 = 'helloworld'
print('w' in s1)
print('z' in s1)
# not in
s1 = 'helloworld'
print('w' not in s1)
print('z' not in s1)

5.位运算符

# Author : zxy
# Date : 2022/5/2 21:44
# 位运算符 & | << >>

# 与运算符 & 同1为1 否则为0
# 0100
# 1000
# &
# 0000
print(4&8)

# 或运算符 | 同0为0 否则为1
# 0100
# 1000
# |
# 1100
print(4|8)

# 逻辑右移 >>
# 0100 => 4
# >> 1
# 0010 => 2
print(4>>1)

# 逻辑左移
# 0100 => 4
# << 1
# 1000 => 8
print(4<<1)

6.输入函数

# Author : zxy
# Date : 2022/5/2 19:42

# input输入函数
name = input('请输入你的名字:')
print(name,type(name))
# 转成int类型方式一
age = input('请输入你的年龄:')
print(age,type(age),int(age),type(int(age)))
# 转成int类型方式二
age = int(input('请输入你的年龄:'))
print(age,type(age))

第四章

1.顺序结构

# Author : zxy
# Date : 2022/5/2 22:21

# 顺序结构,把大象装冰箱
print('---------------程序开始--------------')
print('---------------1.打开冰箱--------------')
print('---------------2.大象放冰箱--------------')
print('---------------3.关冰箱门--------------')
print('---------------程序结束--------------')

2.选择结构-单分支

# Author : zxy
# Date : 2022/5/2 22:21

# 1.选择结构-单分支结构  银行取款

money = 1000

s = int(input('请输入取款金额:'))

if(money >= s):
    money -= s
    print('取款成功,剩余金额为:',money)

3.选择结构-双分支

# Author : zxy
# Date : 2022/5/3 10:31
# 2.选择结构-双分支结构 奇偶判断

i = int(input('请输入一个数字:'))

if i % 2 == 0:
    print('你输入一个偶数!')
else:
    print('你输入一个奇数!')

4.选择结构-多分支

# Author : zxy
# Date : 2022/5/3 10:31

# 3.选择结构-多分支结构 成绩等级划分

score = int(input('请输入一个成绩:'))

# if score >= 90 and score <= 100:
if 90 <= score <=  100:
    print('A级')
elif score >= 80 and score < 90:
    print('B级')
elif score >= 70 and score < 80:
    print('C级')
elif score >= 60 and score < 70:
    print('D级')
else:
    print('不及格')

5.选择结构-嵌套循环

# Author : zxy
# Date : 2022/5/3 10:31
# 4.选择结构-嵌套结构 商场购物
money = int(input('请输入你需要支付金额!'))
vip = bool(input('请输入你是否是会员?True/False'))
if vip:
    if money >= 200:
        print('你需要支付:',money * 0.8)
    elif money >= 100:
        print('你需要支付:',money * 0.9)
    else:
        print('你需要支付:',money)
else:
    if money >= 200:
        print('你需要支付:',money * 0.95)
    else:
        print('你需要支付:',money)

6.循环结构

# Author : zxy
# Date : 2022/5/2 22:21

"""
    循环结构
    while
    for - in
"""
def test1():
    a = 1
    while a < 10:
        print(a)
        a += 1
# 计算0到10的累加
def sum():
    '''初始化变量'''
    sum = 0
    a = 0
    '''条件判断'''
    while a <= 10:
        '''条件执行体'''
        sum += a
        a += 1
    print(sum)
# 1到100偶数和
def number():
    sum = 0
    i = 0
    while i <= 100:
        if i % 2 == 0:
            sum += i
        i+=1
    print('while计算求和',sum)
def number2():
    sum = 0
    for item in range(1,101):
        if item % 2 == 0:
            sum += item
    print('for-in计算求和:',sum)

# 100 到 1000 的水仙花
def water():
    for item in range(100,1001):
        ge = item % 10
        shi = item // 10 % 10
        bai = item // 100
        if ge**3+shi**3+bai**3 == item:
            print(item)

if __name__ == '__main__':
    number()
    number2()
    water()
    '''for-in'''
    for item in 'python':
        print(item)
    for i in range(10):
        print(i)
    for _ in range(1,3):
        print('hello python')

7.break语句

# Author : zxy
# Date : 2022/5/3 13:30
# 通过break退出循环
'''密码三次输入不成功退出,密码正确退出'''
for item in range(3):
    pwd = input('请输入密码:')
    if pwd == '8888':
        print('密码正确')
        break
    else :
        print('密码不正确')
else:
    print('三次密码均失败!')

8.continue语句

# Author : zxy
# Date : 2022/5/3 13:34

'''break是退出循环'''
'''continue是退出当前循环,继续下一个循环'''

'''1到50之间,5的倍数'''
for item in range(1,51):
    '''如果item不是5的倍数,就跳出当前循环,继续下一个循环'''
    if item % 5 != 0:
        continue
    print(item)

9.pass语句

# Author : zxy
# Date : 2022/5/3 10:44
# pass语句,什么都不做,只是一个占位符,用到需要写语句的地方
money = int(input('请输入你需要支付金额!'))
if money >= 200:
    pass
    # 当没想好怎么写的时候,可以先使用pass占位,继续写后面的操作
    # print('你需要支付:', money * 0.8)
elif money >= 100:
    print('你需要支付:', money * 0.9)
else:
    print('你需要支付:', money)

10.range函数

# Author : zxy
# Date : 2022/5/3 10:50

# range函数
'''一个参数,表示从0到10'''
n1 = range(10)
print(list(n1))

'''两个参数,从1开始到19'''
n2 = range(1,19)
print(list(n2))

'''三个参数,从1开始到19,步长为2'''
n3 = range(1,19,2)
print(list(n3))

'''判断指定的整数 在序列中是否存在 in,not in '''
print(10 in n3)
print(10 not in n3)

11.对象的布尔值

# Author : zxy
# Date : 2022/5/2 22:36
"""
Python所有对象都有一个布尔值
   获取对象的布尔值,使用内置函数bool()
   以下对象的布尔值为False
       False
       数值0
       None
       空字符串
       空列表
       空元组
       空字典
       空集合
"""
print(bool(False)) #  False
print(bool(0.0)) # 数值0
print(bool(None)) # None
print(bool('')) # 空字符串
print(bool("")) # 空字符串
print(bool([])) # 空列表
print(bool(list())) # 空列表
print(bool(())) # 空元组
print(bool(tuple())) # 空元组
print(bool()) # 空字典
print(bool(dict())) # 空字典
print(bool(set())) # 空集合

第五章

1.集合

# Author : zxy
# Date : 2022/5/3 22:41

# 集合
"""
集合:
    Python语言提供的内置数据结构
    与列表、字典一样都属于可变类型的序列
    集合是没有value的字典
"""

# 1.集合的创建
"""
集合的创建方式:
    直接
        s = 'python','java'
    使用内置函数set()
        s = set(range(6))
        s = set([1,2,3,4])
        s = set((1,2,3,4))
        s = set('python')
        s = set(1,2,3,4)
        s = set()
"""

def create_tuple():
    s = 'python', 'java','java' # 集合中元素不能重复,会把重复的元素自动去掉
    print(s,type(s))
    s = set(range(6))
    print(s, type(s))
    s = set([5, 2, 3, 4]) # 集合中元素是无序的
    print(s, type(s))
    s = set((1, 6, 3, 4))
    print(s, type(s))
    s = set('python')
    print(s, type(s))
    s = set(1, 2, -1, 4)
    print(s, type(s))
    s = set() # 空集合
    print(s, type(s))
    s =  # 空字典
    print(s, type(s)) # 不能使用空的大括号创建集合,因为这默认是字典

# 2. 集合相关操作
"""
集合元素的判断
    in 
    not in 
集合元素的新增:
    add() ,一次添加一个元素
    update()至少添加一个元素
集合元素的删除:
    remove() ,一次删除一个指定元素,如果指定元素不存在抛出异常KeyError
    discord(),一次删除指定元素,如果指定元素不存在不抛出异常
    调用pop(),一次只删除一个任意元素
    调用clear() ,情况集合
"""
def opter_set():
    s = 'hello','my','python','time'
    print('python是否在集合中?','python' in s)
    print('python是否不在集合中?', 'python' not in s)

    s.add('java')
    print('add添加元素Java:',s)

    s.update('a','b','c')
    print('update添加元素a,b,c:',s)

    s.remove('java')
    print('指定删除Java元素:',s)
    # s.remove('zxy') remove删除一个不存在的元素,会抛出异常
    s.discard('zxy')
    print('discard删除不存在的元素,不会报错:',s)
    s.pop()
    print('pop删除任意一个元素:',s)
    s.clear()
    print('clear清空所有集合元素:',s)

# 3.集合的关系
"""
两个集合是否相等
    可以使用运算符==或!=判断
一个集合是否是另一个集合的子集
    可以调用方法issubset进行判断
    B是A的子集
一个集合是否另一个集合的超集
    可以调用方法issuperset进行判断
    A是B的超集
两个集合是否没有交集
    可以调用方法isdisjoint进行判断
"""
def relation_set():
    s1 = 10,20,30,40
    s2 = 40,10,20,30
    s3 = 10,20
    s4 = 60,70
    print('s1和s2相同?',s1==s2)
    print('s1和s2不相同',s1!=s2)
    print('s3是s1的子集?',s3.issubset(s1))
    print('s1是s3的超集',s1.issuperset(s3))
    print('s1和s4没有交集?',s1.isdisjoint(s4)) # 没有交集为True,有交集为False

# 4.集合的数据操作
"""
    交集
    并集
    差级
"""
def data_opetate():
    s1 = 10, 20, 'hello'
    s2 = 40, 10, 20, 30
    print('方式一:s1和s2交集:',s1.intersection(s2))  # 交集
    print('方式二:s1和s2交集:',s1 & s2)
    print('方式一:s1和s2并集:',s1.union(s2))  # 并集
    print('方式二:s1和s2并集:',s1 | s2)
    print('方式一:s1减去[s1和s2的交集]:',s1.difference(s2))  # 差集
    print('方式一:s2减去[s1和s2的交集]:',s2.difference(s1))
    print('方式二:s1减去[s1和s2的交集]:', s1 - s2)
    print('方式二:s2减去[s1和s2的交集]:', s2 - s1)
    print('s1和s2的并集减去s1和s2的交集:',s1.symmetric_difference(s2)) # 对称差集
# 5. 集合生成式
def create_set():
    s =  i for i in range(6)
    print(s,type(s))
if __name__ == '__main__':
    create_set()

2.列表

# Author : zxy
# Date : 2022/5/3 14:04

"""
列表:
    变量 可以存储一个元素,
        而列表是一个”大容器“可以存储N多个元素,
        程序可以方便的对这些数据进行整体操作
    列表相当于其他语言中的数组
特点:
    列表元素按顺序有序排序
    索引映射唯一一个数据
    列表可以存储重复数据
    任意数据类型混存
    根据需要动态分配和回收内存
"""
def test():
    lst = [98,98.8,'hello']
    print(lst,id(lst))
    print(lst,type(lst))
    print(lst)
    lst2 = list(lst)
    print(lst2,type(lst2))

    print(lst[0])
    print(lst2[0])

'''
元素位置索引
索引:
    正向 0 到 N
    逆向 -N 到 -1
'''
def index_test():
    lst = [98, 98.8, 'hello']
    print(lst.index(98))
    print(lst.index('hello',1,3))
"""
切片:
    获取列表中多个元素
切片的结果->原列表片段的拷贝
切片的范围->
"""
def split_test():
    lst = [10,20,30,40,50,60,70]
    print('原列表:',lst)
    print('起始位2,结束为6,步长为1:',lst[2:6:1])
    print('不设起始,结束为6,步长为2:',lst[:6:2])
    print('起始为2,不设结束,步长为1:',lst[2::1])
    print('不设起始,不设结束,步长为1',lst[::1])
    print('不设起始,不设结束,步长为-1,类似反转',lst[::-1])
"""
判断元素在列表中是否存在:
in 
not in
"""
def exists_test():
    lst = ['yyds','python','java']
    print('yyds' in lst)
    print('zxy' not in lst)
"""
    列表元素的遍历
"""
def list_test():
    lst = ['yyds', 'python', 'java']
    for ls in lst:
        print(ls)
"""
列表元素的增加操作
"""
def append_test():
    lst = ['yyds', 'python', 'java']
    lst2 = ['a','b','c']
    lst3 = [1,2,3]
    print('原数据',lst)
    lst.append('zxy')
    print('append追加后:',lst)
    lst.extend(lst2)
    print('extend追加多个元素:',lst)
    lst.insert(0,666)
    print('insert在索引为0的位置添加666:',lst)
    lst[1:]=lst3
    print('切片替换,从下标1开始的所有元素替换为lst3',lst)

def remove_test():
    lst = ['yyds', 'python', 'java','scala','html']
    print('原数据:',lst)
    lst.remove("yyds") # 从列表中移除一个元素,如果有重复元素,只移除第一个元素
    print('删除lst中指定元素',lst)
    lst.pop(0) # 通过指定索引,删除元素,如果不指定索引,则删除最后一个元素
    print('删除索引为0的数据:',lst)
    new_list = lst[1:3]
    print('切片删除,只留下索引1到3的数据,会产生新的列表对象:',new_list)
    lst[0:1] = []
    print('将列表中索引0到1的位置置空,相当于删除:',lst)
"""
修改列表元素
"""
def modify_test():
    lst = ['yyds', 'python', 'java', 'scala', 'html']
    print('原数据:', lst)
    lst[0] = 'bigdata'
    print('指定下标修改:',lst)
    lst[2:4] = [100,200,300,400]
    print('切片修改:',lst)
"""
排序查询
"""
def sort_test():
    lst = [40,10,30,90,100]
    print('原数据:',lst)
    lst.sort()
    print('不指定排序方式,默认升序排序:',lst)
    lst.sort(reverse=False)
    print('指定升序排序:', lst)
    lst.sort(reverse=True)
    print('指定降序排序:',lst)
    print('-------------------sorted()跟sort()的区别是,sort()是在原有list基础上排序,sorted()是生成新的列表-------------')
    lst = [40, 10, 30, 90, 100]
    print('原数据:', lst)
    new_list = sorted(lst)
    print('默认升序排序:',new_list)
    desc_list = sorted(lst,reverse=True)
    print('指定降序排序:',desc_list)
"""
列表生成式
"""
def create_test():
    lst = [i for i in range(1,10)]
    print(lst)
if __name__ == '__main__':
    create_test()

3.元组

# Author : zxy
# Date : 2022/5/3 21:52

# 元组
"""
什么是元组?
    Python 内置的数据结构之以,是一个不可变序列
不可变序列与可变序列
    不可变序列:字符串、元组
        不可变序列没有增、删、改的操作
    可变序列:列表、字典
        可变序列:可以对序列执行增、删、改操作,对象地址不发生改变
"""

# 1.元组的创建
"""
    1.1 直接小括号
        t = ('python','java')
    1.2 使用内置函数tuple()
        t = tuple(('python','java'))
    1.3 只包含一个元组的元素需要使用逗号和小括号
        t = (10,)
"""
def create_tuple():
    # 空列表创建
    lst = []
    lst = list()
    # 空字典创建
    dic = 
    dic = dict()
    # 空元组创建
    tup = ()
    tup = tuple()
    t = ('python','java')
    print(t,type(t))
    t = tuple(('python', 'java'))
    print(t, type(t))
    t = (10,)
    print(t, type(t))
    # 如果不加逗号,会被识别为int类型
    t = (10)
    print(t, type(t))

# 2.为什么要将元组设计成不可变序列
"""
为什么要将元组设计成不可变序列
    在多任务环境下,同时操作对象时不需要加锁
    因此,在程序中尽量使用不可变序列
注意事项:
    元组中存储的是对象的引用
    a) 如果元组中对象本身是不可变对象,则不能再引用其他对象
    b) 如果元组中的对象是可变对象,则可变对象的引用不允许改变,但数据可以改变
"""
def test():
    tup = (10,['a','b','c'],20)
    print(tup,'类型',type(tup))  # 元组类型
    print(tup[0],'类型',type(tup[0])) # 元组类型中的不可变对象
    print(tup[1],'类型',type(tup[1])) # 元组类型中的可变对象
    # tup[1]是list类型,可以增、删、改数据。但是不能将其改为tup[1]=100这种

# 3.元组的遍历
def list_tuple():
    print('--------------方式一:索引获取--------------------')
    tup = (10, ['a', 'b', 'c'], 20)
    print(tup[0])
    print(tup[1])
    # 但是这样的缺陷是,你要知道总共有多少数据
    print('--------------方式二:遍历查询----------------------')
    for item in tup:
        print(item)

# 主函数
if __name__ == '__main__':
    list_tuple()

4.字典

# Author : zxy
# Date : 2022/5/3 16:47

"""
字典:
    1.什么是字典
    2.字典得原理
    3.字典的创建与删除
    4.字典的查询操作
    5.字典的增删改
    6.字典推导式
"""
# 1.什么是字典
"""
    以Python内置的数据结构之一,与列表一样是一个可变序列
    以键值对的方式存储数据,字典是一个无序的序列
    eg: scores = '张三':100,'李四':99
        字典名:scores
        花括号:
        键:'张三'
        值:100
        冒号::
        逗号:,
"""

# 2.字典原理
"""
    
    字典的实现原理与查字典类似,查字典是先根据部首或拼音查找对应的页码,Python中的字典是根据Key查找Value所在位置
    
    字典元素的位置,不是按照输入的位置,是按照hash函数计算key的得到的
    key:不可变的序列
"""

# 3.字典的创建
def create_dict():
    list1 = ['张三','李四']
    list2 = [100,99]
    scores = '张三':100,'李四':99
    print('字典创建方式一:',scores)
    scores = dict(name='张三',age=18)
    print('字典创建方式二:',scores)
    scores = list1:list2 for list1,list2 in zip(list1,list2)
    print('字典创建方式三:',scores)

# 4.字典的查询
def get_dict():
    scores = '张三': 100, '李四': 99
    print('-----------------方式一和二的区别主要在于:方式一查找不存在的键会报错,方式二会返回一个None值')
    print('查找方式一',scores['张三'])
    print('查找方式二',scores.get('张三'))
    print('查找方式二,不存在的键:',scores.get('zxy'))
    print('查找方式二,不存在的键,修改默认返回值None:',scores.get('zxy',100))

# 5.字典的常用操作
"""
key的判断:in 或者 not in
字典的删除:del scores['张三']
字典的元素新增:scores['zxy']=100
"""
def operate_test():
# 判断是否存在
    scores = '张三': 100, '李四': 99
    print('判断张三是否存在:','张三' in scores)
    print('判断张三是否存在:', 'zxy' in scores)

# 删除元素
    del scores['张三']
    print("删除key='张三':",scores)

# 清空字典
    scores.clear()
    print('清空数据元素:',scores)

# 新增元素
    scores['zxy'] = 100
    print("增加key='zxy',value='100",scores)

# 修改元素
    scores['zxy'] = 99
    print('key是唯一的,如果重复新增,会覆盖原有值:',scores)

# 6.获取字典试图的三种方法
"""
    keys() 获取字典中所有key
    values() 获取字典中所有value
    items() 获取字典中所有key,value
"""
def view_test():
    scores = '张三': 100, '李四': 99
    keys = scores.keys()
    print('获取字典的所有key:',keys)
    values = scores.values()
    print('获取字典的所有value:',values)
    print('-----------------将key集合和list集合转成列表-----------------')
    print(list(keys),list(values))
    items = scores.items()
    print('获取字典中的所有key,value',items)
    print('--------------------将items转成元组tuple集合--------------')
    print(tuple(items))
# 7.循环字典元素
def list_dict():
    scores = '张三': 100, '李四': 99
    for item in scores:
        print('key=',item,'value=',scores[item])
        print('key=',item,'value=',scores.get(item))

# 8.字典的特点
"""
字典的特点:
    字典中所有元素都是一个key-value键值对,key不允许重复,value可以重复
    字典中的元素是无序的
    字典中的key必须是不可变对象
    字典也可以根据需要动态的伸缩
    字典会浪费较大的内存,是一种使用空间换时间的数据结构   *********************
"""

# 9.字典生成式
"""
内置函数zip()
    用于将可迭代的对象作为参数,将对象中对应的元素打包成一个元组,
    然后返回由这些元组组成的列表
"""
def zip_dict():
    lst1 = ['张三','李四','王五']
    lst2 = [100,20,50]

    # 使用zip将两个列表,压缩成一个元组组成的列表
    dic1 = zip(lst1,lst2)
    print(list(dic1),type(dic1))

    # 使用zip元素,将两个元组,组成一个字典
    dic2 = lst1:lst2 for lst1,lst2 in zip(lst1,lst2) 
    print(dic2,type(dic2))


# 主函数
if __name__ == '__main__':
    zip_dict()

5.生成式

# Author : zxy
# Date : 2022/5/4 10:27


# 列表生成式
list1 = [ i for i in range(6)]
print(list1,type(list1))

# 集合生成式
set1 =  i for i in range(6)
print(set1,type(set1))

# 字典生成式
k = ['张三','李四']
v = [100,90]
dict1 = k:v for k,v in zip(k,v)
print(dict1,type(dict1))

6.总结

# Author : zxy
# Date : 2022/5/4 10:30

# 总结

"""
共有列表、字典、元组、集合
列表  []
字典  key:value
元组 ()
集合 
其中:
    列表、字典、集合都是可变的,元组不可变
    列表、元组可以有重复,集合不可以重复,字典的key不可以重复,value可以重复
    列表、元组是有序的,字典、集合是无序的

"""

# 1.元组
"""
创建元组:
    使用小括号()创建
    使用内置函数tuple()创建
元组遍历:
    for ... in 
不可变序列
"""

# 2.集合
"""
创建集合
    使用花括号
    内置函数set()
    集合生成式
集合遍历
    for ... in 
新增
    add()
    update()
删除
    remove()
    discard()
    pop()
    clear()
可变序列
"""

第六章

1.字符串常用操作

# Author : zxy
# Date : 2022/5/4 13:45

# 查询操作
"""
index() 查找字符第一次出现的位置,不存在抛出异常ValueError
rindex() 查找字符最后一次出现的位置,不存在抛出异常ValueError
find() 查找字符第一次出现的位置,不存在返回-1
rfind() 查找字符最后一次出现的位置,不存在返回-1
"""

def find_str():
    s = 'password'
    i = s.index('s')
    print('index查找字符第一次出现的位置,不存在抛出ValueError',i)
    i = s.find('s')
    print('index查找字符第一次出现的位置,不存在返回-1',i)
    i = s.find('z')
    print('index查找字符第一次出现的位置,不存在返回-1', i)
    j = s.rindex('s')
    print('index查找字符最后一次出现的位置,不存在抛出ValueError', j)
    j = s.rfind('s')
    print('index查找字符最后一次出现的位置,不存在返回-1', j)
    j = s.rfind('z')
    print('index查找字符最后一次出现的位置,不存在返回-1', j)

# 2. 字符串带小写转换
"""
upper() 把字符中的所有字符串都转成大写字母
lower() 把字符中的所有字符串都转成小写字母
swapcase() 把字符串中所有大写字母都转成小写字母,把所有小写字母转成大写字母
capitalize() 把第一个字符转成大写,其他转成小写
title() 把每个单词第一个字符转成大写,其余转成小写
"""
def trans_str():
    s = 'hEllo wOrd'
    print('原数据',s)
    print('upper():',s.upper())
    print('lower()',s.lower())
    print('swapcase()',s.swapcase())
    print('captitalize()',s.capitalize())
    print('title()',s.title())

# 3.字符串对齐方式
def align_str():
    s = 'hello word'
    print('居中对齐:',s.center(20,'-'))
    print('左对齐:',s.ljust(20,'_'))
    print('右对齐:',s.rjust(20,'_'))
    print('右对齐,只传一个参数,默认0填充',s.zfill(20))

# 4.字符串拆分
def split_str():
    s1 = 'hello world python'
    s2 = 'hello-world-python'
    print('从左往右分'.center(100,'*'))
    print('split默认按空格拆分',s1.split())
    print('split,设置sep选择分隔符,设置maxsplit设置最大分割次数', s2.split(sep='-',maxsplit=1))
    print('\\n')
    print('从右往左分'.center(100, '*'))
    print('rsplit默认按空格拆分',s1.rsplit())
    print('rsplit,设置sep选择分隔符,设置maxsplit设置最大分割次数', s2.rsplit(sep='-', maxsplit=1))
    """从左往右和从右往左分的最主要的区别在与设置maxsplit后,会得到不同的结果"""

# 5. 字符串判断操作
"""
isidentifier()  是不是合法的标识符
isspace() 是否全部由空白字符串组成(回车、换行、水平制表符)
isalpha() 是否全部由字母组成
isdecimal() 是否全部由二进制数字组成
isnumeric() 是否全部由数字组成 
isalnum() 是否全部由字母和数字组成
"""
def judge_str():
    s1 = 'hello_123'
    s2 = s1.join('@')
    s3 = '      \\t'
    s4 = 'abcd'
    s5 = '1234'
    s6 = '123四'
    print('合法标识符'.center(70,'*'))
    print(s1,'是不是由合法标识符组成',s1.isidentifier())
    print(s1,'是不是由合法标识符组成',s2.isidentifier())

    print('\\n','空白字符串'.center(70, '*'))
    print(s1, '是不是空白字符串组成', s1.isspace())
    print(s3,'是不是空白字符串组成',s3.isspace())

    print('\\n', '字母'.center(70, '*'))
    print(s1,'是不是全部由字母组成',s1.isalpha())
    print(s4, '是不是全部由字母组成', s4.isalpha())

    print('\\n', '十进制数字'.center(70, '*'))
    print(s5,'是不是由十进制数字组成',s5.isdecimal())
    print(s6, '是不是由十进制数字组成', s6.isdecimal())

    print('\\n', '数字'.center(70, '*'))
    print(s5, '是不是由数字组成', s5.isnumeric())
    print(s6, '是不是由数字组成', s6.isnumeric())

    print('\\n', '字母和数字'.center(70, '*'))
    print(s1, '是不是全由字母和数字组成', s1.isalnum())
    print(s4,'是不是全由字母和数字组成',s4.isalnum())

# 6.字符串替换和 合并
def replace_join_str():
    s1 = 'hello java java'
    lst = ['hello','java','python']
    tup = ('hello','java','python')
    print('replace替换',s1.replace('java','python'))
    print('replace只替换1个目标',s1.replace('java','python',1))
    print('join合并','*'.join(s1))
    print('列表合并','*'.join(lst))
    print('元组合并','*'.join(tup))
if __name__ == '__main__':
    replace_join_str()

2.字符串比较操作

# Author : zxy
# Date : 2022/5/4 15:31

# 字符比较操作
"""
字符串的比较操作:
    运算符:> >= < <= == !=
比较规则:
    首先是比较两个字符串中第一个字符,如果相等则继续比较下一个字符,
    依次比较下去,直到两个字符串中的字符不相等时,其比较结果就说两个字符串的比较结果
    两个字符串中的所有后续字符将不再被比较
比较原理:
    两个字符进行比较时,比较是其ordinal value(原始值),调用内置函数ord可以 得到指定字符的Ordinal value。
    与内置函数ord对应的内置函数是chr,调用内置函数chr时指定ordinal value可以得到其对应的字符
"""
def compare_str():
    print('python' > 'java')
    print('p',ord('p'))
    print('j',ord('j'))

    print('112',chr(112))
    print('106',chr(106))

    ## == 比较的值
    ## is 比较的id
if __name__ == '__main__':
    compare_str()

3.字符串切片操作

# Author : zxy
# Date : 2022/5/4 16:05

# 字符串切片操作
"""
字符串是不可变类型
    不具备增、删、改等操作
    切片操作将产生新的对象
"""
s = 'abcdefg'
print('指定切片区间',s[0:2])
print('不指定起始:',s[:2])
print('不指定结束:',s[2:])
print('指定区间、指定步长',s[0:3:2])

4.字符串编码解码

# Author : zxy
# Date : 2022/5/4 16:49

# 字符串的编码解码
"""
为什么需要字符串的编码转换:
    计算机之间的传输是通过byte字节,在计算机展示的时候是字符
编码和解码的方式:
    编码:将字符串转换为二进制数据bytes
    解码:将bytes类型的数据转换成字符串类型
"""

s = '大河向东流'

# 编码
print(s.encode(encoding='GBK')) # 一个中文字符,两个字节
print(s.encode(encoding='UTF-8')) # 一个中文字符,三个字节

# 解码
byte = b'\\xb4\\xf3\\xba\\xd3\\xcf\\xf2\\xb6\\xab\\xc1\\xf7'

print(byte.decode(encoding='GBK'))

byte = b'\\xe5\\xa4\\xa7\\xe6\\xb2\\xb3\\xe5\\x90\\x91\\xe4\\xb8\\x9c\\xe6\\xb5\\x81'
print(byte.decode(encoding='UTF-8'))

5.字符串驻留机制

# Author : zxy
# Date : 2022/5/4 10:41

# 字符串的驻留机制
"""
字符串:
    在Python中字符串是基本数据类型,是一个不可变的字符序列
什么叫字符串驻留机制?
    仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,
    Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同的字符串时,
    不会开辟新的空间,而是把该字符串 的地址赋给新创建的变量
"""
a = 'python'
b = "python"
c = """python"""
print('----------相同字符串,相同地址------------')
print(a,id(a))
print(b,id(b))
print(c,id(c))
print(a is b , b is c , c is a)

"""
驻留机制的几种情况:
    字符串长度为0或1时
    符合标识符的字符串
    字符串只在编译时进行驻留,而非运行时
    [-5,256]之间的整数数字
sys中intern方法强制2个字符串指向同一对象
pycharm对字符串进行了优化处理
"""

"""
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> s1 = 'abc'
>>> s2 = 'abc'
>>> s1 is s2
True
>>> s1 = 'abc%'
>>> s2 = 'abc%'
>>> s1 is s2
False
>>> s1 == s2
True
>>> 
"""


# 字符串驻留的优缺点
"""
字符串驻留的优缺点:
    当需要值相同的字符串时,可以直接从字符串池中拿来使用,
    避免频繁的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是比较影响性能的
    
    在需要进行字符串拼接的时候建议使用str类型的join方法,而非+,
    因为join()方法是先计算出所有字符中的长度,然后拷贝,只new一次对象,效率比+更高
"""
# >>> c = ''.join(['ab','c'])
# >>> c
# 'abc'
# >>> c = 'a'.join(['b','c'])
# >>> c
# 'bac'
# >>>

6.格式化字符串

# Author : zxy
# Date : 2022/5/4 16:21

# 格式化字符串
"""
格式化字符串的两种方式
    %作为占位符: '我的名字叫:%s,今年%d岁了' % (name,age)
        字符串:%s
        整数:%l 或 %d
        浮点数:%f
    作为占位符: '我的名字叫:0,今年1岁了,我真的叫0 format(name,age)
"""

name = 'zxy'
age = 18

print('我叫%s,我今年%d岁了' % (name,age))


print('我叫0,我今年1岁了,我真的叫0'.format(name,age))


# 长度为10,保留小数点后三位
print('%10.3f' % 3.1415926)

print(''.format(3.1415926)) # 只有一个元素,不指定位置也可
print('0:.3'.format(3.1415926)) # 总共保留三位数
print('0:.3f'.format(3.1415926)) # 保留三位小数
print('0:10.3f'.format(3.1415926)) # 设置宽度和精度,一共十位,保留小数点后三位

第七章

1.函数

# Author : zxy
# Date : 2022/5/4 17:22

# 函数
"""
什么是函数:
    函数是执行特定任务和完成特定功能的一段代码
为什么需要函数:
    提高代码可复用性
    隐藏实现细节
    提高可维护性
    提高可读性
函数的创建:
    def 函数名([输入参数]):
        函数体
        [return xxxx]
"""

"""
    在函数调度过程中,进行参数的传递
    如果是不可变对象,在函数体的修改不会影响实参的值
    如果是可变对象,在函数体的修改会影响到实参的值
"""
def cale(a,b): # a,b为形参
    return a + b

if __name__ == '__main__':
    a = cale(10,20) # 10,20 是实参
    print(a)
    b = cale(b=100,a=10) # 指定参数赋值
    print(b)

2.函数返回值

# Author : zxy
# Date : 2022/5/4 18:55
# 函数返回值
"""
函数返回值:
    如果函数没有返回值 return可以不写
    函数的返回值,如果是一个,直接返回类型
    函数返回值,如果是多个,返回结果为元组
"""
# 函数返回多个值,结果为元组
def fun(num):
    odd = []
    even = []
    for i in num:
        if i % 2 == 0 :
            odd.append(i)
        else:
            even.append(i)
    return odd,even

if __name__ == '__main__':
    lists = [10,23,45,23,85,12]
    print('元组:',fun(lists))
    # 函数返回多个值,可以使用下标取值
    print('列表1',fun(lists)[0])
    print('列表2',fun(lists)[1])
    # for i,j in fun(10):
    #     print(i)
    #     print(j)

3.函数默认值

# Author : zxy
# Date : 2022/5/4 19:49


def fun(a,b=20):
    # 这里的为end='\\t'也是给end指定传参,这样就不会使用默认值end='\\n'
    # def print(self, *args, sep=' ', end='\\n', file=None):
    print('begin1',end='\\t')
    print('beigin2')
    return a+b

if __name__ == '__main__':
    a = fun(10)
    print('未给b传参,则b使用默认值',a)
    b = fun(10,30)
    print('给a,b指定传参,则默认值失效',b)

4.位置参数和关键字参数

# Author : zxy
# Date : 2022/5/4 20:01

# 函数得参数定义
"""
个数可变得位置参数:
    定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数
    使用*定义个数可变的位置形参
    结果为一个元组
个数可变的关键字形参:
    定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参
    使用**定义个数可变的关键字形参
    结果为一个字典
"""
def fun1(*args):
    print(args,type(args))

def fun2(**args):
    print(args,type(args))

if __name__ == '__main__':
    fun1(10,20,30)
    fun2(a=10,b=20,c=30)

5.参数总结

# Author : zxy
# Date : 2022/5/4 21:07

# 参数总结

def fun(a,b,c):
    print('a=0,b=1,c=2'.format(a,b,c))

def fun2(a,b,c,d):
    print('a=0,b=1,c=2,d=3'.format(a, b, c,d))
if __name__ == '__main__':
    fun(10,20,30) # 位置传参
    fun(a=10,b=20,c=30) # 关键字传参
    lst = [10,20,30]
    fun(*lst) # 使用lst传参的时候,需要使用*,将列表中的元素依次传给函数fun()
    dic = 'a':10,'b':20,'c':30
    fun(**dic)

6.变量的作用域

# Author : zxy
# Date : 2022/5/4 21:31

# 变量的作用域
"""
变量的作用域:
    程序代码能访问该变量的区域
    根据变量的有效范围可分为:
        局部变量:
            在函数内定义并使用的变量,只有在函数内部有效,
            局部变量使用global声明,这个变量就会变成全局变量
        全局变量:
            函数体外定义的变量,可作用于函数内外

"""
b = 'hello python'
def fun():
    a = 'hello word'
    global c
    c = 'hello java'
    print('局部变量',a)
    print('global局部变量转全局变量',c)
if __name__ == '__main__':
    print('全局变量', b)
    fun()
    # global将局部变量转为全局变量,定义在fun()函数中,需要先调用fun()函数,才能使用全局变量c
    print('global局部变量转全局变量',c)

7.递归函数

# Author : zxy
# Date : 2022/5/4 21:48

#递归函数
"""
什么是递归函数?
    如果在一个函数的函数体内调用了该函数本身,这个函数就成为递归函数
递归的组成部分?
    递归调用与递归终止条件
递归的调用过程?
    每递归调用一次函数,都会在栈内存分配一个栈帧
    每执行完一次函数,都会释放相应的空间
递归的优缺点?
    缺点:占用内存多,效率底下
    优点:思路和代码简单
"""

def fun(n):
    if n == 1:
        return 1
    else:
        return n * fun(n-1)


if __name__ == '__main__':
    print(fun(6))

8.斐波那契

# Author : zxy
# Date : 2022/5/4 22:09

# 斐波那契
"""
                                                fun(6)
                          fun(5)                                      fun(4)
              fun(4)                  fun(3)                  fun(3)              fun(2)
      fun(3)          fun(2)  fun(2)          fun(1)    fun(2)        fun(1)        .
fun(2)     fun(1)        .       .              .         .             .           .
.           .            .       .              .         .             .           .
.           .            .       .              .         .             .           .
1           1            1       1              1         1             1           1
"""
def fun(n):
    if n == 1:
        return 1
    elif n == 2:
        return 1
    else:
        return fun(n-1) + fun(n-2)

if __name__ == '__main__':
    print(fun(6))

第八章

1.bug

# Author : zxy
# Date : 2022/5/4 22:35

# 1.规范操作
"""
1.漏末尾的冒号
2.缩进错误
3.英文字符写成中文
4.字符串连接,把字符串和数字拼接到一起
5.没有定义变量
6.比较运算符==和赋值运算符=的混用
"""

# 2.知识点不熟练导致错误
"""
1.索引越界:indexError
    lst = [11,22,33,44]
    print(lst[4])
2.append()方法使用不熟练
    lst=[]
    lst=append('A','B','C')
    print(lst)
"""

# 3.思路不清导致的问题
"""
基础知识不牢固,练
"""


'''列表套字典,字典里的value值有列表'''
lst = ['rating':[9.7,2062397],'id':'1292052','type':['犯罪','剧情'],'title':'肖申克的救赎','actors':['蒂姆.罗宾斯','摩根.弗里曼'],
       'rating':[9.6,1528760],'id':'1291546','type':['剧情','爱情','同性'],'title':'霸王别姬','actors':['张国荣','张丰毅','巩俐','葛优'],
       'rating':[9.5,1559181],'id':'1292720','type':['剧情','爱情'],'title':'阿甘正传','actors':['汤姆.汉克斯','罗宾.怀特']]

name = input('请输入你要查询演员的名字:')

for movie in lst:
    actor = movie['actors']
    for act in actor:
        if(name in act):
            print(name + '出演了' + movie['title'])


2.Python常见的异常类型

# Author : zxy
# Date : 2022/5/20 14:55


# Python常见的异常类型

ZeroDivisionError #除或取模零的类型
IndexError #序列中没有此索引
KeyError #映射中没有这个键
NameError #未声明/初始化对象(没有属性)
SyntaxError  #Python语法错误
ValueError #传入无效的参数

3.异常处理机制

# Author : zxy
# Date : 2022/5/20 14:05



# 1.try: ... except Error:...
"""
1.问题
程序代码逻辑没有错,只是因为用户错误操作或者一些例外情况而导致的程序崩溃
例如:除数不可以为0
     没有按照输入类型输入指定类型数据
2.解决
针对这种问题,Python提供了异常处理机制,可以在异常的时候出现0时即捕捉,然后内部"消化",让程序继续运行
    try ... except Error:
捕获异常的顺序按照先子类后父类的顺序,为了避免遗漏可能出现的异常,可以在最后增加BaseException
"""

try:
    n1 = int(input('请输入一个整数:'))
    n2 = int(input('请输入另一个整数:'))
    result = n1 / n2
    print('结果为:',result)
except ZeroDivisionError:
    print('除数不可以为0')
except ValueError:
    print('值异常')

except BaseException as e:
    print(e)

# 2.try...except...else结构
"""
如果try块中没有抛出异常,则执行else,如果抛出异常,则执行except
"""

try:
    n1 = int(input('请输入一个整数:'))
    n2 = int(input('请输入另一个整数:'))
    result = n1 / n2
except ZeroDivisionError:
    print('除数不可以为0')
else:
    print('结果为:',result)

# 3.try...except...else...finally
"""
finally块无论如何是否发生异常都会被执行,能常用来释放try块中申请的资源
"""
try:
    n1 = int(input('请输入一个整数:'))
    n2 = int(input('请输入另一个整数:'))
    result = n1 / n2
except ZeroDivisionError:
    print('除数不可以为0')
else:
    print('结果为:',result)
finally:
    print('无论是否抛出异常,都会执行finally,输出这一句')

# 4.try...except...else...finally

4.TraceBack模块的使用

# Author : zxy
# Date : 2022/5/20 22:03

"""
使用traceback模块打印异常信息
"""
import traceback

try:
    print('测试'.center(10,'*'))
    print(1/0)
except:
    traceback.print_exc()

第九章

1.两大编程思想

# Author : zxy
# Date : 2022/5/20 22:14

"""
面向过程:
    事物比较简单,可以线性的思维去解决
面向对象:
    事务比较复杂,使用简单的线性思维无法解决
共同点:
    面向过程和面向对象都是解决实际问题的一种思维方式

联系:
    二者相辅相成,并不是对立的
    解决复杂问题,通过面向对象方式便于我们从宏观把握事务之间复杂的关系,
    方便分析整个系统;具体到微观操作,仍然使用面向过程来处理

"""

2.类和对象的理解

# Author : zxy
# Date : 2022/5/20 22:14

# 1.类和对象
"""
类:
    类是多个类似事物组成的群体的统称。能够帮助我们快速的理解和判断事物的性质
数据类型:
    不同数据类型属于不同的类
    使用内置函数type()查看数据类型
    例如:
        print(type(10))
        print(type(20))
对象:
    10,20都是Int类之下包含相似的不同个例,这个个例的专业术语称为实例或对象
"""

3.类和对象的创建

# Author : zxy
# Date : 2022/5/20 22:46


# 1.类的创建
"""Student为类的名称,由一个或多个单词组成,每个单词首字母大写,其余小写"""
class Student:
    # 直接写在类里的变量,称为类属性
    address = '上海'
    # name,age为实例属性
    def __init__(self,name,age):
        self.name = name
        self.age = age
    # 实例方法
    """在类之外定义的称为函数,在类之内定义的称为方法"""
    def info(self):
        print('name:',self.name,'age:',self.age)
    # 类方法
    @classmethod
    def cm(cls):
        print('类方法')
    # 静态方法
    @staticmethod
    def sm():
        print('静态方法')

# 2.对象的创建
"""
对象的创建又称为类的实例化
语法:
    实例名=类面()

"""
stu = Student('zxy','01')
print(stu.name)
print(stu.age)
stu.info() # 方法一:对象名.方法名()
Student.info(stu) # 方法二:类名.方法名(类的对象) -》 实际上就算定义处的self

4.类属性-类方法-静态方法

# Author : zxy
# Date : 2022/5/20 23:23

# 类属性、类方法、静态方法
"""
类属性:类中方法外的变量称为类属性,被该类所有对象共享
类方法:使用@classmethod修饰的主法,使用类名点直接访问的方法
静态方法:使用 @staticmethod修饰的主法,使用类名点直接访问的方法
"""

class Student:
    # 直接写在类里的变量,称为类属性
    address = '上海'
    # name,age为实例属性
    def __init__(self,name,age):
        self.name = name
        self.age = age
    # 实例方法
    """在类之外定义的称为函数,在类之内定义的称为方法"""
    def info(self):
        print('name:',self.name,'age:',self.age)
    # 类方法
    @classmethod
    def cm(cls):
        print('类方法')
    # 静态方法
    @staticmethod
    def sm():
        print('静态方法')


# 类属性调用
print(Student.address)
Student.address = '杭州'
print(Student.address)

# 类方法调用
Student.cm()

# 静态方法的调用
Student.sm()

5.动态绑定属性和方法

# Author : zxy
# Date : 2022/5/20 23:39

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

    def info(self):
        print('my name is ',self.name,', i am', self.age,' years old')

stu1 = Student('张三',20)
stu2 = Student('李四',30)
print('-----------------属性----------------------------')
print('为stu1动态绑定性别属性')
stu1.gender = '女'
print(stu1.name,stu1.age,stu1.gender)
print('为stu2动态绑定ID属性')
stu2.id = 100
print(stu2.name,stu2.age,stu2.id)
print('-----------------方法----------------------------')
def show():
    print('测试动态绑定方法')
stu1.show = show
stu1.show()

第十章

1.继承

# Author : zxy
# Date : 2022/5/21 10:01

# 继承
"""
父类:动物
子类:猫 、 狗 、 鸟继承动物的属性
如果一个类没有继承任何类,则默认继承Object
Python支持多继承
定义子类的时候,必须在其构造参数中调用父类的构造函数

"""

class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def info(self):
        print('姓名:0,年龄:1'.format(self.name,self.age))

# 定义子类
class Student(Person):
    def __init__(self,name,age,score):
        super().__init__(name,age)
        self.score = score

# 定义子类
class Teacher(Person):
    def __init__(self,name,age,subject):
        super().__i

以上是关于Python的主要内容,如果未能解决你的问题,请参考以下文章

Python中鸭子类型

python二级练习和考试复习(赶鸭子)

python 鸭子类型

python多态

Python 中的鸭子类型和猴子补丁

鸭子类型