我是靠谱客的博主 优雅小伙,最近开发中收集的这篇文章主要介绍python基础语法python基础语法笔记一、Python简介二、Python的基础语法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

python基础语法笔记


文章目录

  • python基础语法笔记
  • 一、Python简介
  • 二、Python的基础语法
    • 第一章
      • 1.1 print()函数
      • 1.2 转义字符
    • 第二章 数据类型
      • 2.1 python中的标识符与保留字
        • 2.1.1 保留字
        • 2.1.2 标识符
      • 2.2 python中的变量与数据类型
        • 2.2.1 变量
        • 2.2.2 整型
        • 2.2.3 浮点型
        • 2.2.4 布尔型
        • 2.2.5 字符串型
        • 2.2.6 数据类型转换
          • 2.2.6.1 str()函数
          • 2.2.6.2 int()函数
          • 2.2.6.3 float()函数
      • 2.3 python中的注释
    • 第三章 运算符
      • 3.1 输入函数input
      • 3.2 python中的运算符
        • 3.2.1 算术运算符
        • 3.2.2 赋值运算符
        • 3.2.3 比较运算符
        • 3.2.4 布尔运算符
        • 3.2.5 位运算符
      • 3.3 运算符的优先级
    • 第四章 组织结构
      • 4.1 程序的组织结构
      • 4.2 顺序结构
      • 4.3 对象的布尔值
      • 4.4 分支结构
        • 4.4.1 单分支if结构
        • 4.4.2 双分支if...else结构
        • 4.4.3 多分支if...elif...else结构
      • 4.5 pass空语句
    • 第五章 循环
      • 5.1 range()函数的使用
      • 5.2 while循环
      • 5.3 for-in循环
      • 5.4 break、continue、else语句
      • 5.5 嵌套循环
    • 第六章 列表
      • 6.1 列表的创建和删除
      • 6.2 列表的查询操作
      • 6.3 列表元素的增删改操作
        • 6.3.1 增
          • 6.3.1.1 append()函数
          • 6.3.1.2 extend()函数
          • 6.3.1.3 insert()函数
          • 6.3.1.4 切片
        • 6.3.2 删
          • 6.3.2.1 remove()函数
          • 6.3.2.2 pop()函数
          • 6.3.2.3 切片
          • 6.3.2.4 clear()函数
          • 6.3.2.5 del
        • 6.3.3 改
          • 6.3.3.1 为指定索引赋值
          • 6.3.3.2 为指定切片赋值
      • 6.4 列表元素的排序
        • 6.4.1 调用sort()方法
        • 6.4.2 调用内置函数sorted()
      • 6.5 列表生成式
    • 第七章 字典
      • 7.1 什么是字典
      • 7.2 字典的原理
      • 7.3 字典的创建与删除
        • 7.3.1 字典的创建
        • 7.3.2 字典的删除
      • 7.4 字典的查询操作
        • 7.4.1 普通
        • 7.4.2 进阶
      • 7.5 字典元素的增删改操作
        • 7.5.1 key的判断
        • 7.5.2 字典元素的删除
        • 7.5.3 字典元素的新增
        • 7.5.4 字典元素的修改
      • 7.6 字典推导式
      • 7.7 字典的其它操作
        • 7.7.1 获取字典视图的三个方法
        • 7.7.2 字典元素的遍历
    • 第八章 元组与集合
      • 8.1 什么是元组
      • 8.2 元组的创建方式
      • 8.3 元组的遍历
      • 8.4 什么是集合
      • 8.5 集合的创建
      • 8.6 集合的增删改查操作
        • 8.6.1 集合元素的判断操作
        • 8.6.2 集合元素的新增操作
        • 8.6.3 集合元素的删除操作
      • 8.7 集合生成式
      • 8.8 集合间的关系
    • 第九章 字符串
      • 9.1 字符串的创建与驻留机制
      • 9.2 字符串的常用操作
        • 9.2.1 字符串的查询操作
        • 9.2.2 字符串的大小写转换操作
        • 9.2.3 字符串的内容对齐操作
        • 9.2.4 字符串劈分操作的方法
        • 9.2.5 判断字符串操作的方法
        • 9.2.6 字符串的替换与合并操作
        • 9.2.7 字符串的比较操作
        • 9.2.8 字符串的切片操作
        • 9.2.9 格式化字符串
    • 第十章 函数
      • 10.1 函数的创建和调用
        • 10.1.1 函数的创建
        • 10.1.2 函数的调用
      • 10.2 函数的参数传递
      • 10.3 函数的返回值
      • 10.4 函数的参数定义
        • 10.4.1 默认值参数
        • 10.4.2 个数可变的位置参数
        • 10.4.3 个数可变的关键字形参
      • 10.5 变量的作用域
      • 10.6 递归函数
    • 第十一章 BUG
      • 11.1 异常的常见类型
      • 11.2 不同异常类型的处理方式
      • 11.3 异常处理机制
        • 11.3.1 多个except结构
        • 11.3.2 try...except...else结构
        • 11.3.3 try...except...else...finally结构
        • 11.3.4 traceback模块
    • 第十二章 面向对象(一)
      • 12.1 类和对象的创建
      • 12.2 类属性、类方法、静态方法
      • 12.3 动态绑定属性和方法
    • 第十三章 面向对象(二)
      • 13.1 封装
      • 13.2 继承
      • 13.3 方法重写
      • 13.4 object类
      • 13.5 多态
      • 13.6 特殊方法和特殊属性
        • 13.6.1 特殊属性
        • 13.6.2 特殊方法
      • 13.7 类的浅拷贝与深拷贝
        • 13.7.1 变量的赋值操作
        • 13.7.2 浅拷贝
        • 13.7.3 深拷贝
    • 第十四章 模块
      • 14.1 什么叫模块
      • 14.2 自定义模块
      • 14.3 以主程序的形式执行
      • 14.4 python中的包
      • 14.5 python中常用的内置模块
      • 14.6 第三方模块的安装及使用
    • 第十五章 文件目录操作
      • 15.1 编码格式介绍
      • 15.2 文件的读写操作
      • 15.3 常用的文件打开模式
      • 15.4 文件对象常用的方法
      • 15.5 with语句(上下文管理器)
      • 15.6 目录操作
        • 15.6.1 os模块操作目录相关函数
        • 15.6.2 os.path模块操作目录相关函数

一、Python简介

1、python是跨平台的计算机程序设计语言
2、与Java不同的是python没有编译环节
3、python是面向对象的语言
4、python是一种交互式的语言,可以在提示符>>>后直接执行代码

二、Python的基础语法

第一章

1.1 print()函数

#可以输出数字
print(520)
print(98.5)

#可以输出字符串
print('hello world')  #在Python中使用单引号或双引号是没有区别的
print("hello world")  #单双引号的使用可以减少单双引号转义字符的使用

#含有运算符的表达式
print(3+1)

#将数据输出到文件当中,注意点:1、所指定的盘要存在,2、使用file=fp 否则数据没法写入文件
fp=open('D:/text.text','a+')  #如果文件不存在就创建,存在就在文件的内容后面继续追加
print('hello world',file=fp)
fp.close()

#不进行换行输出(输出内容在一行中)
print('hello',' world','python')#这个不会在文件中输出

输出
520
98.5
hello world
hello world
4
hello  world python

1.2 转义字符

当字符串中包含反斜杠、单引号和双引号等有特殊作用的字符时,必须使用反斜杠对这些字符进行转义。

字符转义字符
反斜杠\
单引号
双引号‘’
换行n
退格b
回车r
空格t
print('hellonworld')
print('hellotworld')
print('hellorworld') #world将hello进行了覆盖
print('hellobworld') #退一个格,把o退没了

print('http:\\www.baidu.com')
print('老师说'大家好'')

#原字符,不希望字符串中的转义字符起作用,就使用原字符,在字符串前加上r或R
print(r'hellonworld')
#注意事项,最后一个字符不能是反斜杠
#print(r'hellonworld') 这种情况会报错
print(r'hellonworld\') #这种没问题

输出
hello
world
hello	world
world
hellworld
http:\www.baidu.com
老师说'大家好'
hellonworld
hellonworld\

第二章 数据类型

2.1 python中的标识符与保留字

2.1.1 保留字

与关键字意思差不多,不能作为你的对象的名字

#查看所有关键字
import keyword
print(keyword.kwlist)

2.1.2 标识符

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

2.2 python中的变量与数据类型

变量由三部分组成
1、标识:表示对象所存储的内存地址,使用内置函数id(obj)来获取
2、类型:表示的是对象的数据类型,使用内置函数type(obj)来获取
3、值:表示对象所存储的具体数据,使用print()可以将值进行打印输出

当多次赋值之后,变量名会指向新的空间(新的id)

2.2.1 变量

name='玛丽亚'
print(name)
print('标识',id(name))
print('类型',type(name))
print('值',name)

输出
玛丽亚
标识 2267853848624
类型 <class 'str'>
值 玛丽亚

常用的数据类型:整型 int、浮点型 float、布尔型 bool、字符串型 str

2.2.2 整型

n1=90
n2=-90
n3=0
print(n1,type(n1))
print(n2,type(n2))
print(n3,type(n3))

#整数可以表示成二进制、八进制、十进制
print('十进制',118)
print('二进制',0b10101111)
print('八进制',0o176)
print('十六进制',0x1EAF)

输出

90 <class 'int'>
-90 <class 'int'>
0 <class 'int'>
十进制 118
二进制 175
八进制 126
十六进制 7855

2.2.3 浮点型

a=3.14159
print(a,type(a))
n1=1.1
n2=2.2
n3=2.1
print(n1+n2) #使用浮点数进行计算时,可能会出现小数位数不确定的情况
print(n1+n3)

from decimal import Decimal
print(Decimal('1.1')+Decimal('2.2'))

输出
3.14159 <class 'float'>
3.3000000000000003
3.2
3.3

2.2.4 布尔型

f1=True
f2=False
print(f1,type(f1))
print(f2,type(f2))

#布尔值可以转换成整数计算
print(f1+1) #2  1+1的结果是2 True表示1
print(f2+1) #1  0+1的结果为1 False表示0

输出
True <class 'bool'>
False <class 'bool'>
2
1

2.2.5 字符串型

⚪单引号和双引号定义的字符串必须在一行
⚪三引号定义的字符串可以连续分布在多行

str1='人生苦短,我用python'
str2="人生苦短,我用python"
str3="""人生苦短,
我用python"""
str4='''人生苦短,
我用python'''
print(str1,type(str1))
print(str2,type(str2))
print(str3,type(str3))
print(str4,type(str4))

输出
人生苦短,我用python <class 'str'>
人生苦短,我用python <class 'str'>
人生苦短,
我用python <class 'str'>
人生苦短,
我用python <class 'str'>

2.2.6 数据类型转换

2.2.6.1 str()函数

将int型通过str()函数转成str型,同理其它类型也可通过此函数进行转换

name='张三'
age=20

print(type(name),type(age)) #name与age的数据类型不同
 # print('我叫'+name+'今年'+age+'岁')  
 #会报错,name和age的数据类型不同
print('我叫'+name+',今年'+str(age)+'岁')

输出
<class 'str'> <class 'int'>
我叫张三,今年20
2.2.6.2 int()函数

⚪文字类和小数类字符串无法转换成整数
⚪浮点数转换成整数,抹零取整

s1='128'
f1=98.7
s2='76.77'
ff=True
s3='hello'
print(type(s1),type(f1),type(s2),type(ff),type(s3))
print(int(s1),type(int(s1))) #将str转换成int类型,字符串为数字串
print(int(f1),type(int(f1))) #将float转换成int类型,舍弃小数
 #  print(int(s2),type(int(s2))) 会报错 小数串
print(int(ff),type(int(ff)))
 #  print(int(s3),type(int(s3))) 会报错 必须为数字串

输出
<class 'str'> <class 'float'> <class 'str'> <class 'bool'> <class 'str'>
128 <class 'int'>
98 <class 'int'>
1 <class 'int'>
2.2.6.3 float()函数

⚪文字类无法转换
⚪整数转换后末尾加上.0

s1='128.98'
s2='76'
ff=True
s3='hello'
i=98
print(type(s1),type(s2),type(ff),type(s3),type(i))
print(float(s1),type(float(s1)))
print(float(s2),type(float(s2)))
print(float(ff),type(float(ff)))
 #print(float(s3),type(float(s3))) 报错
print(float(i),type(float(i)))

输出
<class 'str'> <class 'str'> <class 'bool'> <class 'str'> <class 'int'>
128.98 <class 'float'>
76.0 <class 'float'>
1.0 <class 'float'>
98.0 <class 'float'>

2.3 python中的注释

⚪单行注释:以#开头
⚪多行注释:一对三引号之间的代码称为多行注释
⚪三引号若赋值给变量,则认为是字符串,否则是多行注释)

第三章 运算符

3.1 输入函数input

⚪作用:接收来自用户的输入
⚪返回值类型:输入值的类型为str
⚪值的存储:使用=对输入的值进行存储

present=input('大圣想要什么礼物呢?n') #使input函数之后需要用户在键盘输入
print(present,type(present))

输出
大圣想要什么礼物呢?
金箍棒
金箍棒 <class 'str'>

3.2 python中的运算符

3.2.1 算术运算符

加(+)、减(-)、乘()、除(/)、整除(//)、取余(%)、幂运算符(**)

print(11//2) #抹去小数点
print((11//(-3))) #一正一负向下取整
print(2**3) #表示的是2的3次方
print(-9%4) #余数=被除数-除数*商 余数=-9-4*(-3)=3 商是向下取整

输出
5
-4
8
3

3.2.2 赋值运算符

执行顺序:从右往左
支持链式赋值:a=b=c=20
支持参数赋值:+=、-=、*=、/=、//=、%=
支持系列解包赋值:a,b,c=20,30,40

a=b=c=20
print(a,id(a))
print(b,id(b))
print(c,id(c))

a,b=20,20.1
print(type(a),type(b))
a,b=b,a
print(a,b)

输出
20 140727499999488
20 140727499999488
20 140727499999488
<class 'int'> <class 'float'>
20.1 20

3.2.3 比较运算符

比较运算符的结果是bool型

a,b=10,20
print('a>b吗',a>b)  #比较运算符的结果为bool型

输出
a>b吗 False

3.2.4 布尔运算符

and、or、not、in、not in

a,b=1,2
print(a==1 and b==2)
print(a==1 and b<2)
print(not a)

s='hello'
print('k' in s)

输出
True
False
False
False

3.2.5 位运算符

print(2 & 2) #十进制转为八位二进制,按位与,
print(2 & 1)
print(4 | 8) #十进制转为八位二进制,按位或
print(4 << 2) #十进制转为八位二进制,左移两位

输出
2
0
12
16

3.3 运算符的优先级

算术运算符>位运算符>比较运算符>布尔运算符>赋值运算符

第四章 组织结构

4.1 程序的组织结构

计算机的流程控制 1、顺序结构 2、选择结构 3、循环结构

4.2 顺序结构

添加断点,对程序进行调试

4.3 对象的布尔值

⚪获取对象的布尔值使用内置函数bool()
⚪以下对象的布尔值为False:False、0、None、空字符串、空列表、空元组、空字典、空集合

4.4 分支结构

4.4.1 单分支if结构

money=1000
s=int(input('请输入取款金额'))
if money>=s:
    money-=s
    print('取款成功,余额为:',money)
    
输出
请输入取款金额100
取款成功,余额为: 900

4.4.2 双分支if…else结构

s=int(input('请输入一个整数'))
if s%2==0:
    print(s,'是偶数')
else:
    print(s,'是奇数')
    
输出
请输入一个整数5
5 是奇数

⚪另有条件判断语句
⚪正确就执行if左边的语句,错误就执行else右边的语句

a,b=10,20
print(str(a)+'大于'+str(b) if a>b else str(a)+'小于'+str(b))

输出
10小于20

4.4.3 多分支if…elif…else结构

score=int(input('请输入成绩:'))
if score>90:
    print('A级')
elif score>60 and score<=90:
    print('B级')
else:
    print('C级')
    
输出
请输入成绩:55
C级

4.5 pass空语句

⚪语句什么都不做,知识一个占位符,用在语法上需要语句的地方
⚪使用情况:先搭建语法结构,还没想好代码怎么写的时候

answer=input('您是会员吗?y/n')
if answer=='y':
    pass
else:
    pass

输出
您是会员吗?y/n y

进程已结束,退出代码0

第五章 循环

5.1 range()函数的使用

⚪用于生成一个整数序列
⚪创建range对象的三种方式
1、range(stop) 创建一个(0,stop)之间的整数序列,步长为1
2、range(start,stop) 创建一个(start,stop)之间的整数序列,步长为1
3、range(start,stop,step) 创建一个(start,stop)之间的整数序列,步长为step

r=range(10)     
print(r)        
print(list(r))  
                
r2=range(2,5)   
print(list(r2)) 
                
r3=range(3,10,2)
print(list(r3)) 

输出
range(0, 10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 3, 4]
[3, 5, 7, 9]

5.2 while循环

a=1
while a<5:
    print(a)
    a+=1
 
输出
1
2
3
4

5.3 for-in循环

in表示从(字符串、序列等)中依次取值,又称为遍历

for item in range(5):  #将in后的序列依次赋值给for后的对象
    print(item)  
#如果用不到自定义变量,可将自定义变量写为"_"  
    
输出
0
1
2
3
4

5.4 break、continue、else语句

break、continue与其它语言用法一样,就不进行描述了。

for item in range(3):
    pwd=input('请输入密码n')
    if pwd=='8888':
        print('密码正确')
        break
    else:
        print('密码错误')
else:            #当for循环正常循环结束时,执行此else语句
    print('对不起,三次密码均错误')
    
 输出
请输入密码
111
密码错误
请输入密码
222
密码错误
请输入密码
333
密码错误
对不起,三次密码均错误

5.5 嵌套循环

内容重复,不过多概述
需注意,内层循环中的break和continue只用于控制本层循环

第六章 列表

6.1 列表的创建和删除

#列表的创建,第一种方式,使用中括号[]
lst1=['hello','world',123]
print(lst1)

#列表的创建,第二种方式,使用内置函数list()
lst2=list(['hello','world',123])
print(lst2[-3])  #从左往右0开始,从右往左-1开始

输出
['hello', 'world', 123]
hello

6.2 列表的查询操作

lst=['hello','world','hello',123]
print(lst.index('hello'))  #如果列表中有相同元素,只返回第一个元素的位置
print(lst.index('hello',1,3)) #限定查找位置

输出
0
2
lst=[10,20,30,40,50,60,70,80]
print(lst[1:6:1])   #获取列表中的多个元素 列表名[start:stop:step]  [start,stop)

print(lst[-1:-3:-1]) #step是负数表示从后往前开始 最后一个为-1

输出
[20, 30, 40, 50, 60]
[80, 70]

6.3 列表元素的增删改操作

6.3.1 增

6.3.1.1 append()函数

在列表的末尾添加一个元素,一次只能添加一个

lst=[10,20,30]
lst.append(100)
print(lst)

输出
[10, 20, 30, 100]
6.3.1.2 extend()函数

在列表的末尾至少添加一个元素

lst1=[10,20,30]
lst2=[10,20,30]
lst1.extend(lst2)
print(lst1)
lst1.append(lst2)
print(lst1)

输出
[10, 20, 30, 10, 20, 30]
[10, 20, 30, 10, 20, 30, [10, 20, 30]]
6.3.1.3 insert()函数

在列表的任意位置添加一个元素

lst=[10,20]
lst.insert(2,30) #在第二个位置上插入元素,第二个位置及其之后的元素后移
print(lst)

输出
[10, 20, 30]
6.3.1.4 切片

在列表的任意位置添加至少一个元素

lst=[10,20,30,40]
new_lst=['hello']
lst[1:3]=new_lst
print(lst)

输出
[10, 'hello', 40]

6.3.2 删

6.3.2.1 remove()函数

⚪一次删除一个元素
⚪重复的元素只删除第一个

lst=[10,20,30,40,30]
lst.remove(30)
print(lst)

输出
[10, 20, 40, 30]
6.3.2.2 pop()函数

⚪删除一个指定位置上的元素
⚪不指定索引,删除列表中最后一个元素

lst=[10,20,30,40,30]
lst.pop(1)
lst.pop() #不指定则删除最后一个元素
print(lst)

输出
[10, 30, 40]
6.3.2.3 切片

一次最少删除一个元素

lst=[10,20,30,40]
new_lst=lst[1:3]
print(lst,new_lst)
lst[1:3]=[]
print(lst)

输出
[10, 20, 30, 40] [20, 30]
[10,40]
6.3.2.4 clear()函数

清空列表

lst=[10,20,30]
lst.clear()
print(lst)

输出
[]
6.3.2.5 del

删除列表

lst=[10,20,30]
del lst

6.3.3 改

6.3.3.1 为指定索引赋值
lst=[10,20,30,40]
lst[1]=100
print(lst)

输出
[10, 100, 30, 40]
6.3.3.2 为指定切片赋值
lst=[10,20,30,40]
lst[1:3]=100,200
print(lst)

输出
[10, 100, 200, 40]

6.4 列表元素的排序

6.4.1 调用sort()方法

⚪列表中所有元素默认按照从小到大的顺序进行排序
⚪可以指定revers=True进行降序排序

lst=[10,30,20,40]
lst.sort()
print(lst)
lst.sort(reverse=True)
print(lst)

输出
[10, 20, 30, 40]
[40, 30, 20, 10]

6.4.2 调用内置函数sorted()

⚪调用内置函数sorted()
⚪可以指定revers=True进行降序排序,原列表不发生改变(生成新的对象)

lst=[10,30,20,40]
new_lst=sorted(lst)
print(new_lst)
desc_lst=sorted(lst,reverse=True)
print(desc_lst)

输出
[10, 20, 30, 40]
[40, 30, 20, 10]

6.5 列表生成式

lst1=[i for i in range(1,10)]
print(lst1)
lst2=[i*2 for i in range(1,6)]
print(lst2)

输出
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 4, 6, 8, 10]

第七章 字典

7.1 什么是字典

⚪字典是python内置的数据结构之一,与列表一样是一个可变序列
⚪以键值对的方式存储数据,字典是一个无序的序列

scores={ ' 张三 ' : 90 , ' 李四 ' : 98 , ' 王五 ' : 45 }

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

7.2 字典的原理

哈希存储,根据key查找value所在的位置

7.3 字典的创建与删除

7.3.1 字典的创建

#使用花括号{}创建字典
scores={ ' 张三 ' : 90 , ' 李四 ' : 98 , ' 王五 ' : 45 }
print(scores)

#使用内置函数 dict()创建字典
student=dict(name='张三',scores=99)
print(student)

输出
{' 张三 ': 90, ' 李四 ': 98, ' 王五 ': 45}
{'name': '张三', 'scores': 99}

7.3.2 字典的删除

7.4 字典的查询操作

7.4.1 普通

#使用scores[]方式
scores={ ' 张三 ' : 90 , ' 李四 ' : 98 , ' 王五 ' : 45 }
print(scores[' 张三 '])

#使用get()方法
print(scores.get(' 张三 '))

#注意
print(scores.get(' 陈六 ')) #none
print(scores.get(' 麻七 ',99))  #查找麻七不存在时,提供的默认值99

输出
90
90
None
99

7.4.2 进阶

lst=[
    {'rating':[9.7,50],'id':111,'type':'犯罪','title':'肖申克的救赎','actors':['蒂姆','摩根']},
    {'rating':[9.6,50],'id':222,'type':'爱情','title':'霸王别姬','actors':['张国荣','张丰毅']},
    {'rating':[9.5,50],'id':333,'type':'悬疑','title':'控方证人','actors':['泰隆','马琳']}
     ]

name=input('请输入你想查询的演员:')
for item in lst:
    act_list=item['actors']
    for actor in act_list:
        if name in actor:
            print(name,'出演了',item['title'])

输出
请输入你想查询的演员:张国荣
张国荣 出演了 霸王别姬

7.5 字典元素的增删改操作

7.5.1 key的判断

判断指定的key在字典中是否存在,使用in或not in

scores={ ' 张三 ' : 90 , ' 李四 ' : 98 , ' 王五 ' : 45 }
print(' 张三 ' in scores)
print(' 张三 ' not in scores)

输出
True
False

7.5.2 字典元素的删除

scores={ ' 张三 ' : 90 , ' 李四 ' : 98 , ' 王五 ' : 45 }
del scores[' 张三 ']
print(scores)

scores.clear()
print(scores)

输出
{' 李四 ': 98, ' 王五 ': 45}
{}

7.5.3 字典元素的新增

scores={ ' 张三 ' : 90 , ' 李四 ' : 98 , ' 王五 ' : 45 }
scores.clear()
print(scores)

scores['陈六']=98
print(scores)

输出
{}
{'陈六': 98}

7.5.4 字典元素的修改

scores={ ' 张三 ' : 90 , ' 李四 ' : 98 , ' 王五 ' : 45 }
scores.clear()
print(scores)

scores['陈六']=98
print(scores)

scores['陈六']=100
print(scores)

输出
{}
{'陈六': 98}
{'陈六': 100}

7.6 字典推导式

7.7 字典的其它操作

7.7.1 获取字典视图的三个方法

scores={ ' 张三 ' : 90 , ' 李四 ' : 98 , ' 王五 ' : 45 }
keys=scores.keys()
print(keys)
print(list(keys)) #将所有的key组成的视图转成列表

values=scores.values()
print(values)
print(list(values))

items=scores.items()
print(items)
print(list(items))

输出
dict_keys([' 张三 ', ' 李四 ', ' 王五 '])
[' 张三 ', ' 李四 ', ' 王五 ']
dict_values([90, 98, 45])
[90, 98, 45]
dict_items([(' 张三 ', 90), (' 李四 ', 98), (' 王五 ', 45)])
[(' 张三 ', 90), (' 李四 ', 98), (' 王五 ', 45)]

7.7.2 字典元素的遍历

scores={'张三':90,'李四':98,'王五':45}
for item in scores:  #遍历键
    print(item,scores[item],scores.get(item))
    
输出
张三 90 90
李四 98 98
王五 45 45

第八章 元组与集合

8.1 什么是元组

元组是python内置数据结构之一,是一个不可变序列

⚪不可变序列:字符串,元组 没有增删改的操作
⚪可变序列:列表,字典 可以增删改,对象地址不发生改变

8.2 元组的创建方式

#直接使用小括号
t=('python','word',98)
print(t)

#使用内置函数tuple()
t2=tuple(('hello','word',99))
print(t2)

t3='hello',23
print(tuple(t3))

#只包含一个元素需要使用逗号,
t4=('hello')
print(type(t4))
t5=('hello',)
print(type(t5),t5)

输出
('python', 'word', 98)
('hello', 'word', 99)
('hello', 23)
<class 'str'>
<class 'tuple'> ('hello',)

8.3 元组的遍历

t=tuple(('python','world',99))
print(t)
for item in t:
    print(item)
    
输出
('python', 'world', 99)
python
world
99

8.4 什么是集合

⚪python提供的内置数据结构
⚪与列表、字典一样都是可变类型的序列
⚪集合是没有value的字典

8.5 集合的创建

#使用{}创建集合
s={'hello','word',8,8}  #集合中的元素不能重复,且无序
print(s)

#使用内置函数set()创建集合
s1=set(range(6))
print(s1,type(s1))

s2=set([1,2,3,4,5]) #将列表转换为集合
print(s2,type(s2))
	
s3=set((1,2,3,4)) #将元组转换为集合
print(s3,type(s3))
	
s4=set('python') #将字符串转换为集合
print(s4,type(s4))

#创建空集合
s7=set()

	输出
	{8, 'hello', 'word'}
	{0, 1, 2, 3, 4, 5} <class 'set'>
	{1, 2, 3, 4, 5} <class 'set'>
	{1, 2, 3, 4} <class 'set'>
	{'o', 'n', 'p', 'h', 'y', 't'} <class 'set'>

8.6 集合的增删改查操作

8.6.1 集合元素的判断操作

s={10,20,30,40,50}
print(60 in s)
print(60 not in s)

输出
False
True

8.6.2 集合元素的新增操作

s={10,20,30,40,50}
s.add(60)   #一次添加一个元素
print(s)
t={70,80}
s.update(t)
print(s)
s.update(['hello']) #一次至少添加一个元素
print(s)

输出
{40, 10, 50, 20, 60, 30}
{70, 40, 10, 80, 50, 20, 60, 30}
{'hello', 70, 40, 10, 80, 50, 20, 60, 30}

8.6.3 集合元素的删除操作

s={10,20,30,40,50}
s.remove(30)  #一次移除一个元素,不存在这个元素则报错
print(s)

s.discard(500)
print(s)     #一次移除一个元素,元素不存在不报错

s.pop()
print(s)    #一次随机删除一个元素

s.clear()
print(s)    #清空集合

输出
{40, 10, 50, 20}
{40, 10, 50, 20}
{10, 50, 20}
set()

8.7 集合生成式

8.8 集合间的关系

相等、子集、超集、交集

s1={10,20,30,40}
s2={30,40,50,60}
s3={10,20}

print(s1!=s2) #判断集合相等(元素相同就相等)

print(s3.issubset(s1)) #s3是否是s1的子集
print(s2.issubset(s1))  #s2是否是s1的子集

print(s1.issuperset(s3))  #s1是否是s3的超集
print(s1.issuperset(s2))   #s1是否是s2的超集

print(s1.isdisjoint(s2))   #判断是否有交集,有交集就是false
print(s2.isdisjoint(s3))   #没有交集就是true

输出
True
True
False
True
False
False
True

第九章 字符串

9.1 字符串的创建与驻留机制

字符串的驻留机制:python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同的字符串不会开辟新的空间。

a='python'
b="python"
c="python"

print(a,id(a))
print(a,id(b))
print(a,id(c))

输出
python 2715141037744 #每个地址都一样
python 2715141037744
python 2715141037744

9.2 字符串的常用操作

9.2.1 字符串的查询操作

index() 查找子串第一次出现的位置,若子串不存在,则抛出ValueError
rindex() 查找子串最后一次出现的位置,若子串不存在,则抛出ValueError
find() 查找子串第一次出现的位置,若子串不存在,则返回-1
rfind() 查找子串最后一次出现的位置,若子串不存在,则返回-1

s='hello,hello'
print(s.index('lo'))
print(s.rindex('lo'))
print(s.find('lo'))
print(s.rfind('lo'))
print(s.find('k'))

输出
3
9
3
9
-1

9.2.2 字符串的大小写转换操作

upper() 把字符串中所有的字符都转换成大写字母
lower() 把字符串中所有的字符都转换成小写字母
swapcase() 字符串中的所有字符大写转小写,小写转大写
capitalize() 字符串中的第一个字符大写,其余小写
title() 把每个单词的第一个字符转为大写

s='heLLo,pyTHon'
a=s.upper()
print(a)
print(s.lower())
print(s.swapcase())
print(s.title())
print(s.capitalize())

输出
HELLO,PYTHON
hello,python
HEllO,PYthON
Hello,Python
Hello,python

9.2.3 字符串的内容对齐操作

⚪center() :居中对齐,第一个参数指定宽度,第二个参数指定填充字符,第二个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符串
⚪ljust() :左对齐,第一个参数指定宽度,第二个参数指定填充字符,第二个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符串
⚪rjust() :右对齐,第一个参数指定宽度,第二个参数指定填充字符,第二个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符串
⚪zfill() :右对齐,左边用0填充,该方法直接收一个参数,用于指定字符串的宽度,如果指定的宽度小于等于字符串的长度,返回字符串本身

s='hello python'
print(s.center(20,'#'))
print(s.ljust(20,'*'))
print(s.rjust(30,'$'))
print(s.rjust(30))
print(s.zfill(40))

输出
####hello python####
hello python********
$$$$$$$$$$$$$$$$$$hello python
                  hello python
0000000000000000000000000000hello python

9.2.4 字符串劈分操作的方法

⚪split() :从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表
⚪通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串会单独作为一部份
⚪以通过参数sep指定劈分字符串是的劈分符

⚪rsplit() :从字符串的右边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表
⚪通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串会单独作为一部份
以通过参数sep指定劈分字符串是的劈分符

s='hello python'
lst=s.split()   #默认的劈分符是空格
print(lst)

s1='hello|word|python'
lst1=s1.split(sep='|') 
print(lst1)

s2='hello|word|python'
print(s2.split(sep='|',maxsplit=1))

输出
['hello', 'python']
['hello', 'word', 'python']
['hello', 'word|python']

9.2.5 判断字符串操作的方法

isidentifier() :判断指定的字符串是不是合法的标识符
isspace() :判断指定的字符串是否全部由空白字符组成(回车、换行、水平制表符)
isalpha() :判断指定的字符串是否全部由字母组成
isdecimal() :判断指定的字符串是否全部由十进制的数组成
isnumerric() :判断指定的字符串是否全部由数字组成
isalnum() :判断指定的字符串是否全部由字母和数字组成

s='hello,python'
print(s.isidentifier())
print('hello'.isidentifier())
print(s.isspace())
print(' '.isspace())
print(s.isalpha())
print('abc'.isalpha())
print(s.isdecimal())
print('123'.isdecimal())
print(s.isnumeric())
print(s.isalnum())

输出
False
True
False
True
False
True
False
True
False
False

9.2.6 字符串的替换与合并操作

⚪replace() :第一个参数指定被替换的子串,第二个参数指定替换子串的字符串,该方法返回替换后得到的字符串,替换前的字符串不发生变化,调用该方法时可以通过第三个参数指定最大替换次数
⚪join() :将列表或元组中的字符串合并成一个字符串

s='hello,python'
print(s.replace('python','java'))
s1='hello,python,python,python'
print(s1.replace('python','java',2))

lst=['hello','java','python']
print('|'.join(lst))
print(''.join(lst))

print('*'.join('python'))

输出
hello,java
hello,java,java,python
hello|java|python
hellojavapython
p*y*t*h*o*n

9.2.7 字符串的比较操作

运算符:>,>=,<,<=,==,!=

⚪比较规则:首先比较字符串的第一个字符,如果相等则继续比较下一个字符,依次比较下去,直到两个字符串中的字符不相等时,其比较结果就是两个字符串是比较结果,两个字符串中的后续字符将不再被比较

print('apple'>'app')
print('apple'>'banana')
print(ord('a'),ord('b'))

print(chr(97),chr(98))

'''
==与is的区别
==比较的是value
is比较的是id是否相等
'''

输出
True
False
97 98
a b

9.2.8 字符串的切片操作

字符串是不可变类型,不具备增删改等操作,切片操作将产生新的对象

s='hello,python'
s1=s[:5]    #没有指定起始位置,所以从零开始
s2=s[6:]    #没有指定结束位置,所以切到字符串的最后  #左闭右开
s3='!'
newstr=s1+s2+s3

print(s1)
print(s2)
print(newstr)

print(s[1:5:1]) #从1开始截到5之前,不包括5   s[start:stop:step]
print(s[::2])
print(s[::-1]) #默认从字符串的最后一个元素开始,到字符串的第一个元素结束,因为步长为负数
print(s[-6::1])

输出
hello
python
hellopython!
ello
hlopto
nohtyp,olleh
python

9.2.9 格式化字符串

name='李四'
age=20

# % 做占位符
print('姓名:%s,年龄:%d'%(name,age))

# {} 做占位符
print('我叫{0},今年{1}岁'.format(name,age))

#f-string
print(f'我叫{name},今年{age}岁了')

print('%10d'%99)  #10表示的是宽度
print('%.3f'%3.1415)   #.3表示保留三位小数

print('{0:.3}'.format(3.14159))  #:.3表示保留三位数
print('{0:10.3f}'.format(3.1415))   #:.3f表示保留三位小数

输出
姓名:李四,年龄:20
我叫李四,今年20岁
我叫李四,今年20岁了
        99
3.142
3.14
     3.142

第十章 函数

10.1 函数的创建和调用

10.1.1 函数的创建

def 函数名 ( [输入参数] ):
         函数体
         [ return xxx ]

10.1.2 函数的调用

def calc(a,b):
    c=a+b
    return c

result=calc(1,2)
print(result)

输出
3

10.2 函数的参数传递

def calc(a,b):    #a,b为形式参数
    c=a+b
    return c

result=calc(1,2)   #1和2为实际参数
print(result)

res=calc(b=2,a=1)   #关键字参数不按顺序传递参数
print(res)

输出
3
3
def fun(arg1,arg2):
    print('arg1=',arg1)
    print('arg2=',arg2)
    arg1=100
    arg2.append(10)
    print('arg1',arg1)
    print('arg2',arg2)

n1=11
n2=[22,33,44]
print('n1',n1)
print('n2',n2)
fun(n1,n2)
print('n1',n1)
print('n2',n2)
'''在函数调用过程中,进行参数的传递
如果是不可变的对象,在函数体的修改不会影响实参的值,arg1的修改为100,不会影响n1的值
如果是可变对象,在函数体的修改会影响实参的值,arg2的修改,append(10),会影响到n2的值
'''

输出
n1 11
n2 [22, 33, 44]
arg1= 11
arg2= [22, 33, 44]
arg1 100
arg2 [22, 33, 44, 10]
n1 11
n2 [22, 33, 44, 10]

10.3 函数的返回值

函数返回多个值时,结果为元组

def fun(num):
    odd=[]
    even=[]
    for i in num:
        if i%2:
            odd.append(i)
        else:
            even.append(i)
    return odd,even

lst=[10,11,12,13,14,15,16]
print(fun(lst))

输出
([11, 13, 15], [10, 12, 14, 16])

10.4 函数的参数定义

10.4.1 默认值参数

函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参

def fun(a,b=10):  #b称为默认值参数
    print(a,b)

fun(100)
fun(10,20)  #b与默认值不符,传递实参

输出
100 10
10 20

10.4.2 个数可变的位置参数

⚪定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数。
⚪使用*定义个数可变的位置形参,结果为一个元组

def fun(*args):
    print(args)

fun(10)
fun(10,30)
fun(30,80,110)

输出
(10,)
(10, 30)
(30, 80, 110)

10.4.3 个数可变的关键字形参

⚪定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参。
⚪使用**定义个数可变的关键字形参,结果为一个字典

def fun(**args):
    print(args)

fun(a=10)
fun(a=20,b=30,c=40)

输出
{'a': 10}
{'a': 20, 'b': 30, 'c': 40}

在一个函数定义的过程中,既有个数可变的关键字形参,也有个数可变的位置形参,要求,个数可变的位置形参放在个数可变的关键字形参之前

10.5 变量的作用域

⚪局部变量:在函数内定义并使用的变量,只在函数内部有效,局部变量使用global声明,这个变量就会生成全局变量
⚪全局变量:函数体外定义的变量,可作用于函数体外

def fun():
    global age
    age=20
    print(age)

fun()    
print(age)   #需先调用一下函数
输出
20
20

10.6 递归函数

def fac(n):
    if n==1:
        return 1
    else:
        return n*fac(n-1)
    
print(fac(6))

输出
720

第十一章 BUG

11.1 异常的常见类型

语法错误:SyntaxError

age=input('请输入你的年龄')
if int(age)>=18  #没加冒号
    print('成年人应该负法律责任了')

输出
    if int(age)>=18
                  ^
SyntaxError: invalid syntax

索引越界错误:IndexError

lst=[11,22,33,44]
print(lst[4])   #索引越界

输出
    print(lst[4])
IndexError: list index out of range

除(或取模)零(所有数据类型):ZeroDivisionError

a = 1
b = 0
result = a / b
print(result)

输出
    result = a / b
ZeroDivisionError: division by zero

映射中没有这个键:KeyError

dic={'name':'张三','age':22}
print(dic['gender'])  #字典中没有这个键

输出
    print(dic['gender'])
KeyError: 'gender'

未声明初始化对象(没有属性):NameError

print(key)

输出
    print(key)
NameError: name 'key' is not defined

传入无效的参数:ValueError

a=int('hello')

输出
    a=int('hello')
ValueError: invalid literal for int() with base 10: 'hello'

11.2 不同异常类型的处理方式

1、注释掉可能出错的代码进行调试
2、对关键字print()进行调试

11.3 异常处理机制

Python提供了异常处理机制,可以在异常出现时及时捕获,然后内部消化掉,让程序继续运行

11.3.1 多个except结构

while(1):
    try:
        a = int(input('请输入第一个正数'))
        b = int(input('请输入第二个正数'))
        result = a / b
        print('结果为:', result)
    except ZeroDivisionError:
        print('除数不允许为0')
    except ValueError:
        print('只能输入数字串')
        
输出
请输入第一个正数
只能输入数字串
请输入第一个正数1
请输入第二个正数0
除数不允许为0
请输入第一个正数

11.3.2 try…except…else结构

try:
    a = int(input('请输入第一个正数'))
    b = int(input('请输入第二个正数'))
    result = a / b
except BaseException as e:  #所有的异常都会被捕获,异常的别名叫做e
    print('出错了',e)
else:
    print('结果为:',result)

输出
请输入第一个正数w
出错了 invalid literal for int() with base 10: 'w'

11.3.3 try…except…else…finally结构

try:
    a = int(input('请输入第一个正数'))
    b = int(input('请输入第二个正数'))
    result = a / b
except BaseException as e:  #所有的异常都会被捕获,异常的别名叫做e
    print('出错了',e)
else:
    print('结果为:',result)
finally:
    print('无论是否出错,凑会执行此句,谢谢您的使用')
    
输出
请输入第一个正数1
请输入第二个正数2
结果为: 0.5
无论是否出错,凑会执行此句,谢谢您的使用

11.3.4 traceback模块

import traceback
try:
    num=10/0
except:
    traceback.print_exc()

    输出
        num=10/0
ZeroDivisionError: division by zero

第十二章 面向对象(一)

12.1 类和对象的创建

类的创建:

class Student:
    native_pace='吉林'   #直接写在类里的变量,称为类属性
    
    def __int__(self,name,age):
        self.name=name   #self.name称为实体属性,进行了一个赋值操作,将局部变量的name的值赋给实体属性
        self.age=age

    #实例方法
    def eat(self):       #实例方法    在类之外定义的称为函数,在类之内定义的称为方法
        print('学生在吃饭')

    #静态方法
    @staticmethod
    def method():
        print('我使用staticmethod进行修饰,所以我是静态方法')

    #类方法
    @classmethod
    def cm(cls):
        print('我是类方法,因为我使用了classmethod进行修饰')


def drink():     #函数
    print('喝水')

对象的创建:

#创建Student的实例对象
stu1=Student('张三',22)   #注意类中init方法是不是有两个参数
print(stu1.name)
print(stu1.age)

输出
张三
22

12.2 类属性、类方法、静态方法

类属性:类中方法外的变量称为类属性,被该类的所有对象共享

stu2=Student('李四',20)
stu3=Student('王五',21)
print(stu2.native_pace)      
print(stu3.native_pace)

输出
吉林
吉林

类方法:使用@classmethod修饰的方法,使用类名直接访问的方法

stu1.eat()            #对象名.方法名
Student.eat(stu1)     #类名.方法名(类的对象)    两者的代码功能相同,都是调用Student中的eat方法

输出
学生在吃饭
学生在吃饭

静态方法:使用@staticmethod修饰的方法,使用类名直接访问的方法

12.3 动态绑定属性和方法

动态绑定属性

stu1.gender='女'   #起始创建的类没有gender属性,后期对对象动态绑定
print(stu1.gender)
print(stu2.gender)

输出
女
Traceback (most recent call last):
  File "D:/pythonproject/vippython/chap12/demo3.py", line 14, in <module>
    print(stu2.gender)
AttributeError: 'Student' object has no attribute 'gender'

动态绑定方法

def show():
    print('定义在类之外的称为类函数')

stu1.show=show
stu1.show()
stu2.show()

输出
    stu2.show()
AttributeError: 'Student' object has no attribute 'show'
定义在类之外的称为类函数

第十三章 面向对象(二)

13.1 封装

⚪封装:提高程序的安全性,将数据(属性)和行为(方法)包装到类对象中。在方法内部对属性进行操作,在类对象的外部调用方法。
⚪在python中没有专门的修饰符用于属性的私有,如果该属性不希望在类对象外部被访问,前边使用两个’‘_’’

class Student:
    def __init__(self,name,age):
        self.name=name
        self.__age=age  #年龄不希望在类的外部被使用,所以加两个下划线

    def show(self):
        print(self.name,self.__age)

stu=Student('张三',20)
stu.show()
#print(stu.__age)  出错,类对象外部访问
#print(dir(stu))
print(stu._Student__age)  #在类的外部可以通过 _Student__age 进行访问

输出
张三 20
20

13.2 继承

⚪提高代码的复用性
⚪如果一个类没有继承任何类,则默认继承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 Tercher(Person):
    def __init__(self,name,age,tno):
        super().__init__(name,age)
        self.tno=tno

stu=Student('Jack',20,'100')
tea=Tercher('Tom',40,'1001')
stu.info()
tea.info()
print(stu.score)
print(tea.tno)

输出
姓名:Jack,年龄:20
姓名:Tom,年龄:40
100
1001

13.3 方法重写

⚪如果子类对继承自父类的某个属性或方法不满意,可以在子类中对其(方法体)进行重新编写
⚪子类重写后的方法中可以通过super().xxx()调用父类中被重写的方法

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 Tercher(Person):
    def __init__(self,name,age,tno):
        super().__init__(name,age)
        self.tno=tno
    def info(self):    #重写
        super().info()
        print(self.tno)

stu=Student('Jack',20,'100')
tea=Tercher('Tom',40,'1001')
stu.info()
tea.info()

输出
姓名:Jack,年龄:20
姓名:Tom,年龄:40
1001

13.4 object类

⚪object类是所有类的父类,因此所有类都有object类的属性和方法。
⚪内置函数dir()可以查看指定对象所有属性
⚪object有一个__str__()方法,用于返回一个对于“对象的描述”,对应于内置函数str()经常用于print()方法,帮我们查看对象的信息,所以我们经常会对__str__()进行重写

class Student:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        return '我的名字是:{0},今年:{1}岁了'.format(self.name,self.age)
stu=Student('张三',22)
print(dir(stu))
print(stu)   #默认会调用__str__()这样的方法
print(type(stu))
输出
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name']
我的名字是:张三,今年:22岁了
<class '__main__.Student'>

13.5 多态

⚪提高程序的可拓展性和可维护性
⚪简单地说,多态就是“具有多种形态”,它指的是:即便不知道一个变量所引用的对象到底是什么类型,仍然可以通过这个变量调用方法,在运行的过程中根据变量所引用的对象的类型,动态决定调用哪个对象中的方法

class Animal(object):
    def eat(self):
        print('动物会吃')

class Cat(Animal):
    def eat(self):
        print('猫吃鱼')

class Dog(Animal):
    def eat(self):
        print('狗吃骨头')

class Person:
    def eat(self):
        print('人吃五谷杂粮')

#定义一个函数
def fun(obj):
    obj.eat()

#开始调用函数
fun(Cat())
fun(Dog())
fun(Animal())
fun(Person())

输出
猫吃鱼
狗吃骨头
动物会吃
人吃五谷杂粮

13.6 特殊方法和特殊属性

名称描述
特殊属性–dict–获得类对象或实例对象所绑定的所有属性和方法的字典
特殊方法–len–()通过重写–len–()方法,让内置函数len()的参数可以是自定义类型
–add–()通过重写–add–()方法,可使用自定义对象具“+”功能
–new–()用于创建对象
–init–()对创建的对象初始化

注:横杠为下划线,表格的问题,下划线打不出来

13.6.1 特殊属性

#print(dir(object))   查看属性和方法

class A:
    pass
class B:
    pass
class C(A,B):
    def __init__(self,name,age):
        self.name=name
        self.age=age
class D(A):
    pass


#创建C类的对象
x=C('Tom',20)  #是C类的一个实例对象
print(x.__dict__)    #实例对象的属性字典
print(C.__dict__)    #类对象的属性和方法的字典
print('-------------------')
print(x.__class__)   #输出对象所属的类
print(C.__bases__)   #C类的父类类型的元素
print(C.__base__)    #同上,输出一个
print(C.__mro__)     #类的层次结构
print(A.__subclasses__())     #子类的列表



输出
{'name': 'Tom', 'age': 20}
{'__module__': '__main__', '__init__': <function C.__init__ at 0x0000023C0BE087B8>, '__doc__': None}
-------------------
<class '__main__.C'>
(<class '__main__.A'>, <class '__main__.B'>)
<class '__main__.A'>
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
[<class '__main__.C'>, <class '__main__.D'>]

进程已结束,退出代码0

13.6.2 特殊方法

add()方法

a=20
b=100
c=a+b
d=a.__add__(b)

print(c,d)

class Student:
    def __init__(self,name):
        self.name=name
    def __add__(self, other):
        return self.name+other.name

stu1=Student('Tom')
stu2=Student('Jack')

s=stu1+stu2  #实现了两个对象的加法运算(因为在Student类中 编写__add__()特殊方法)
print(s)
s=stu1.__add__(stu2)
print(s)

输出
120 120
TomJack
TomJack

len()方法

lst=[11,22,33,44]
print(len(lst))
print(lst.__len__())    #查看对象的长度

class Student:
    def __init__(self,name):
        self.name=name
    def __len__(self):
        return len(self.name)   #在类方法中定义,就可以查看字符的长度

stu=Student('Jack')
print(stu.__len__())


输出
4
4
4

new()方法
init()方法

class Person(object):

    def __new__(cls, *args, **kwargs):
        print('__new__被调用执行了,cls的id值为{0}'.format(id(cls)))        # 1416
        obj=super().__new__(cls)
        print('创建的对象的id为{0}'.format(id(obj)))                       # 5904
        return obj

    def __init__(self,name,age):
        print('__init__被调用执行了,self的id值为{0}'.format(id(self)))     # 5904
        self.name=name
        self.age=age

print('objece这个类对象的id为:{0}'.format(id(object)))                     # 2800
print('Person这个类对象的id为:{0}'.format(id(Person)))                     # 1416

#创建Person类的实例对象
p1=Person('Tom',20)
print('p1这个Person类的实例对象的id为:{0}'.format(id(p1)))                   # 5904
输出
objece这个类对象的id为:1688742800
Person这个类对象的id为:2109440721416
__new__被调用执行了,cls的id值为2109440721416
创建的对象的id2109442655904
__init__被调用执行了,self的id值为2109442655904
p1这个Person类的实例对象的id为:2109442655904

进程已结束,退出代码0

13.7 类的浅拷贝与深拷贝

13.7.1 变量的赋值操作

只是形成两个变量,实际上还是指向同一个对象

class CPU:
    pass
class Disk:
    pass
class Computer:
    def __init__(self,cpu,disk):
        self.cpu=cpu
        self.disk=disk

cpu1=CPU()
cpu2=cpu1
print(cpu1,id(cpu1))
print(cpu2,id(cpu2))
输出
<__main__.CPU object at 0x0000027A9D0D4F60> 2725644160864
<__main__.CPU object at 0x0000027A9D0D4F60> 2725644160864

13.7.2 浅拷贝

python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象

class CPU:
    pass
class Disk:
    pass
class Computer:
    def __init__(self,cpu,disk):
        self.cpu=cpu
        self.disk=disk

#变量的赋值
cpu1=CPU()
cpu2=cpu1

#类的浅拷贝
disk=Disk()
computer=Computer(cpu1,disk)  #创建一个计算机类的对象
print(computer,computer.cpu,computer.disk)

#浅拷贝
import copy
computer2=copy.copy(computer)
print(computer2,computer2.cpu,computer2.disk)
输出
<__main__.Computer object at 0x0000024C64E00278> <__main__.CPU object at 0x0000024C64DF4F60> <__main__.Disk object at 0x0000024C64E00240>
<__main__.Computer object at 0x0000024C64E002E8> <__main__.CPU object at 0x0000024C64DF4F60> <__main__.Disk object at 0x0000024C64E00240>

13.7.3 深拷贝

使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同

class CPU:
    pass
class Disk:
    pass
class Computer:
    def __init__(self,cpu,disk):
        self.cpu=cpu
        self.disk=disk

#变量的赋值
cpu1=CPU()
cpu2=cpu1

#类的浅拷贝
disk=Disk()
computer=Computer(cpu1,disk)  #创建一个计算机类的对象
print(computer,computer.cpu,computer.disk)

#浅拷贝
import copy
computer2=copy.copy(computer)
print(computer2,computer2.cpu,computer2.disk)

#深拷贝
computer3=copy.deepcopy(computer2)
print(computer3,computer3.cpu,computer3.disk)
输出
<__main__.Computer object at 0x000002897DCC0240> <__main__.CPU object at 0x000002897DCB4B00> <__main__.Disk object at 0x000002897DCB4F60>
<__main__.Computer object at 0x000002897DCC02B0> <__main__.CPU object at 0x000002897DCB4B00> <__main__.Disk object at 0x000002897DCB4F60>
<__main__.Computer object at 0x000002897DCC0278> <__main__.CPU object at 0x000002897DCC0588> <__main__.Disk object at 0x000002897DCC0B70>

第十四章 模块

14.1 什么叫模块

⚪模块的英文为Moudules
⚪函数与模块的关系:一个模块中可以包含许多函数
⚪在python中一个拓展名为.py的文件就是一个模块
⚪使用模块的好处:
1、方便其他程序和脚本的导入并使用
2、避免函数名和变量名冲突
3、提高代码的可维护性
4、提高代码的可重用性

14.2 自定义模块

⚪创建模块:新建一个.py文件,名称尽量不要与python自带的便准模块名称相同
⚪导入模块: import 模块名称 [ as 别名 ]
from 模块名称 import 函数/变量/类

导入系统模块:

import math      #关于数学运算
print(type(math))
print(math)
print(math.pi)
print('-------------------')
print(dir(math))
print(math.pow(2,3))       #幂
print(math.ceil(9.001))    #向上取整

输出
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
8.0
10
import math
from math import pi   #仅仅导入math模块中的pi方法 直接使用别的方法则报错
print(pi)
print(math.pow(2,3))

输出
3.141592653589793
8.0

导入自定义的模块:

# 自定义calc模块

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

def sub(a,b):
    return a-b
#自定义result模块
import calc   #导入自定义的calc模块
print(calc.add(10,20))
print(calc.sub(20,10))

输出
30
10
from calc import add  #导入自定义模块中的一个函数
print(add(10,20))

输出
30

14.3 以主程序的形式执行

⚪每个模块的定义中都包括一个记录模块名称的变量__name__,程序可以检查该变量,以确定他们在哪个模块中执行。如果一个模块不是被导入到其它程序中执行,那么它可能在解释器的顶级模块中执行。顶级模块的__name__变量的值为__main__

例如:

#自定义calc2模块

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

print(add(1,2))
#自定义result2模块
import calc2
print(calc2.add(100,200))

输出
3       #会把导入的模块中的也一并输出
300

此时可在源模块中加入这样的代码(以主程序方式运行):

#自定义calc2模块

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

if __name__ == '__main__':    #表示仅在运行此模块中才会执行以下的代码
    print(add(1,2))
#自定义result2模块
import calc2
print(calc2.add(100,200))

输出
300

14.4 python中的包

⚪包是一个分层次的目录结构,它将一组功能相近的模块组织在一个目录下
⚪作用:代码规范、避免模块冲突
⚪包与目录的区别:
1、包含__init__.py文件的目录称为包
2、目录里通常不包含__init__.py文件
⚪包的导入:import 包名.模块名

import pac.module_a as a   #导入pac包中的module_a模块 并把此模块赋别名a
print(a.a)

'''import pac.module_a     #导入pac包中的module_a模块
print(pac.module_a.a)'''  

#两者功能一样

注意:
1、使用import方式进行导入时,只能跟包名或模块名
2、使用from…import…可以导入包、模块、函数、变量

import pac
import pac.module_a
import calc
from pac.module_a import a
from pac import module_a

14.5 python中常用的内置模块

模块名描述
sys与python解释器及其环境操作相关的标准库
time提供与实时间关的各种函数的标准库
os提供了访问操作系统服务功能的标准库
calendar提供与日期相关的各种函数的标准库
urllib用于读取来自网上(服务器)的数据标准库
json用于使用JSON序列化和反序列化对象
re用于在字符串中执行正则表达式匹配和替换
math提供标准算数运算函数的标准库
decimal用于进行精确控制运算精度、有效数位和四舍五入操作的十进制运算
logging提供了灵活的记录事件、错误、警告和调试信息等日志信息的功能

sys

import sys
print(sys.getsizeof(24))
print(sys.getsizeof(45))
print(sys.getsizeof(True))
print(sys.getsizeof(False))
输出
28
28
28
24

time

import time
print(time.time())
print(time.localtime(time.time()))
输出
1664938688.4037917
time.struct_time(tm_year=2022, tm_mon=10, tm_mday=5, tm_hour=10, tm_min=58, tm_sec=8, tm_wday=2, tm_yday=278, tm_isdst=0)

urllib

import urllib.request
print(urllib.request.urlopen('http://www.baidu.com').read())#读取百度服务器返回的

14.6 第三方模块的安装及使用

第三方模块的安装:pip install 模块名
第三方模块的使用:import 模块名

第十五章 文件目录操作

15.1 编码格式介绍

⚪python的解释器使用的是Unicode(内存)
⚪.py文件在磁盘上使用UTF-8存储(外存)

15.2 文件的读写操作

文件的读写操作

file=open('A.txt','r',encoding='utf-8')  #文件中有中文时编码格式改为utf-8
print(file.readlines())
file.close()

输出
['中国n', '魅力']

15.3 常用的文件打开模式

⚪文本文件:存储的是普通“字符”文本,默认为Unicode字符集,可以使用记事本程序打开
⚪二进制文件:把数据内容用“字节”进行存储,无法用记事本打开,必须使用专门的软件打开,例如:MP3,jpg,doc

打开模式描述
r以只读模式打开文件,文件的指针将会放在文件的开头
w以只写模式打开文件,如果文件不存在则创建文件,如果文件存在,则覆盖原有内容,文件的指针在文件的开头
a以追加模式打开文件,如果文件不存在则创建,文件指针在文件开头,如果文件存在,则在文件末尾追加文件,文件指针在原文件末尾
b以二进制方式打开文件,不能单独使用,需要与其它模式一起使用,如rb,wb
+以读写方式打开文件,不能单独使用,需要与其他模式一起使用,a+

w

file=open('b.txt','w')
file.write('python')
file.close()

rb、wb

src_file=open('course.png','rb')

target_file=open('copy.png','wb')

print(target_file.write(src_file.read()))

target_file.close()
src_file.close()

15.4 文件对象常用的方法

方法名说明
read([size])从文件中读取size个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容
readline()从文本中读取一行内容
readlines()把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回
write(str)将字符串str内容写入文件
writelines(s_list)将字符串列表s_list写入文本文件,不添加换行符
seek(offset,[whence])把文件指针移动到新的位置,offset表示相对于whence的位置:offset为正往结束方向移动,为负往开始方向移动。whence不同的值代表不同含义:0:从文件头开始计算、1:从当前位置开始计算、2:从文件尾开始计算
tell()返回文件指针的当前位置
flush()把缓冲区的内容写入文件,但不关闭文件
close()把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源

15.5 with语句(上下文管理器)

with语句可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确关闭,以此来达到释放资源的目的

with open('A.txt','r',encoding='utf-8') as file:
    print(file.read())

15.6 目录操作

15.6.1 os模块操作目录相关函数

⚪os模块是python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。
⚪os模块与os.path模块用于对目录或文件进行操作

#os模块是与操作系统发相关的一个模块
import os
os.system('notepad.exe')  #打开记事本
os.system('calc.exe')     #打开计算器

#直接调用可执行文件
os.startfile('C:Program Files (x86)TencentQQBinQQ.exe')
函数说明
getcwd()返回当前的工作目录
listdir(path)返回指定路径下的文件和目录信息
mkdir(path[,mode])创建目录
makedirs(path1/path2…[,mode])创建多级目录
rmdir(path)删除目录
removedirs(path1/path2…)删除多级目录
chdir(path)将path设置为当前的工作目录
import os
print(os.getcwd())
print(os.listdir('../chap15'))
#os.mkdir('newdir')
#os.makedirs('A/B/C/D')
#os.rmdir('../chap15/newdir')
#os.removedirs('A/B/C/D')
os.chdir('D:\pythonproject\vippython\chap15')
print(os.getcwd())

15.6.2 os.path模块操作目录相关函数

函数说明
abspath(path)用于获取文件或目录的绝对路径
exists(path)用于判断文件或目录是否存在,如果存在返回True,否则返回False
join(path,name)将目录与目录或文件名拼接起来
splitext()分离文件名和拓展名
basename(path)从一个目录中提取文件名
dirname(path)从一个路径中提取文件路径,不包括文件名
isdir(path)用于判断是否为路径
import os.path
print(os.path.abspath('demo8.py'))
print(os.path.exists('demo8.py'),os.path.exists('demo9.py'))
print(os.path.join('D:\pythonproject','demo8.py'))
print(os.path.split('D:\pythonproject\vippython\chap15\demo8.py'))
print(os.path.splitext('demo8.py'))
print(os.path.basename('D:\pythonproject\vippython\chap15\demo8.py'))
print(os.path.dirname('D:\pythonproject\vippython\chap15\demo8.py'))
print(os.path.isdir('D:\pythonproject\vippython\chap15\demo8.py'))

输出
D:pythonprojectvippythonchap15demo8.py
True False
D:pythonprojectdemo8.py
('D:\pythonproject\vippython\chap15', 'demo8.py')
('demo8', '.py')
demo8.py
D:pythonprojectvippythonchap15
False

进程已结束,退出代码0

最后

以上就是优雅小伙为你收集整理的python基础语法python基础语法笔记一、Python简介二、Python的基础语法的全部内容,希望文章能够帮你解决python基础语法python基础语法笔记一、Python简介二、Python的基础语法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部