1.8 python

python基础

一 原码 反码 补码

正数

  • 原码反码和补码一样都是对应的这个数的二进制形式

负数

  • 原码是对应的正数的二进制码且第一个数字为1

  • 反码是除符号位其余位是原码取反

  • 补码是将反码加1

二 编码规范、注释、关键字、标识符

1 编码规范

a.一条语句占用一行

b.语句的后面不需要添加任何符号

c.尽量避免在代码中出现中文或者空格

d.一行代码的长度最好不好超过80个字符【代码可读性降低】

e.要区分代码块,使用缩进【if语句,while语句等】

2 注释

​ 注释是编写程序时,写程序的人给代码所做的一种解释性的文字,能提高代码的可读性,方便以后的阅读和维护

​ 注释是解释性文字,在运行程序时,会被程序跳过,不做任何处理【简单来说,在程序中出现的任何内容,如果不想被执行,则都可以将其转化为注释】

方式:

​ 单行注释:#xxxx

​ 多行注释:“”“xxxxx”“” ‘’‘xxxxx’‘’

#这是一个单行注释

"""
这是一个多行注释
多行注释
"""

'''
这是一个多行注释
多行注释
'''
3 关键字

在Python中,已经被赋予了特殊含义的英文单词,如:if,while,break,continue,pass,finally等

【面试题:列出Python中常用的关键字以及的含义】

4 标识【zhi】符【重点掌握】

在Python中,自定义的字符名称

定义合法标识符的规则:规则必须遵守,如果不遵守,代码报错

​ a.只能由数字,字母和下划线组成

​ b.开头不能是数字

​ c.不能使用其他特殊符号

​ d.不能是Python的关键字

​ e.不能使用空格或者中文

​ f.严格区分大小写

定义合法标识符的规范:可以不遵守,如果不遵守,则代码可读性和可维护性不高

​ a.尽量做到见名知意【一般采用简单的英文单词表示】

​ b.命名方式:

​ 方式一:Python官方推荐的写法:所有单词的字母全部小写,不同的单词之间使用下划线连接,如:stu_score

​ 方式二:大多数编程语言通用的写法:驼峰命名法

​ a.大驼峰命名:所有单词的首字母大写,如:StuScore,一般用于类的定义

​ b.小驼峰命名:除了首单词之外,其他所有单词的首字母大写,如:stuScore

​ c.常量命名法:所有的单词的所有字母全部大写,不同的单词使用下划线连接

练习:下面那些标识符是合法的

zhangsan abc@123 123abc break

三 数据类型【重点掌握】

计算机用来做数学运算,计算机程序需要处理生活中不同类型的数据,除了除了普通的文本之外,还需要处理图片,音视频,网页等各种各样的数据,处理不同的数据,需要使用不同的类型表示不同的数据

分类:

number:数字类型【整型:整数 int,浮点型:小数 float,复数:a + bj complex

string:字符串类型 str

boolean:布尔类型【只有两个值,分别为True和False】bool

None:空值

​ 数据结构:list【列表】,tuple【元组】,dict【字典】,set【集合】

​ 特殊:function:函数 class:类

1 type 类型
list1 = [1,2,3]
print(list1)
print(type(list1))#<class 'list'>
print("+++++++++++++++++++++++++++++++++++++")
tuple1 = (1,2,3)
print(tuple1)
print(type(tuple1))#<class 'tuple'>
print("+++++++++++++++++++++++++++++++++++++")
dict1 = {"a":1,"x":10}
print(dict1)
print(type(dict1))#<class 'dict'>
print("+++++++++++++++++++++++++++++++++++++")
set1 = {10,20,30}
print(set1)
print(type(set1))#<class 'set'>

四 常量和变量【重点掌握】

1.常量

程序在运行的过程中,值永远不会发生改变的标识符

本质:仍然是一个变量,但是为了区分,通常使用常量命名法区分常量和变量

常量命名法:所有单词的所有字母全部大写,不同的单词之间使用下划线分隔

2.变量
2.1概念以及定义

程序在运行的过程中,值会随时发生改变的标识符,注意:不但可以改变值,也可以改变类型

语法:标识符 = 值

说明:

​ 标识符:对于每个变量需要给它起一个名称,被称为变量名,也被称为引用

​ 值:第一次给变量赋予的值被称为初始值,但是,该值是可以随时被修改的

#定义一些变量
a=10
print(a)
print(type(a))#<class 'int'>
print("+++++++++++++++++++++++++++++++++")
a=8
print(a)
a="hehe"
print(type(a))#<class 'str'>
print("+++++++++++++++++++++++++++++++++")
print(a)
a='we'
print(type(a))
print("+++++++++++++++++++++++++++++++++")
a=True
print(a)
print(type(a))#<class 'bool'>
print("+++++++++++++++++++++++++++++++++")
a=1.9
print(type(a))#<class 'float'>
print("+++++++++++++++++++++++++++++++++")
a=None#用于把一个变量的值置空
print(type(a))#<class 'NoneType'>
print("+++++++++++++++++++++++++++++++++")
2.2内存中的变量

注意:

​ a.变量名 = 值,变量名存储在栈空间中,值存储在堆空间中

​ b.变量中存储数据,实际上存储的是数据的地址

​ c.定义变量实际上:在内存中开辟了一块空间,将一个指定的数据存储到该空间中,并且给该空间进行了命名

【面试题】注意:如果一个数据没有引用指向的时候,则该数据会被系统的垃圾回收机制回收,目的是为了释放所占用的空间【工作原理:当一个变量的引用计数为0.则说明该变量需要被废弃掉,现在使用的自动管理内存,不需要手动操作一个变量的引用计数】

为了加速Python的执行效率,方便管理内存,让内存空间可以重复利用【内存池】

2.2.1 id()获取地址
#1.id():获取一个变量在内存中的地址,一个数据的地址在内存中是唯一的
a=10
b=10
print(a,b)
print(id(a))#1543284096
print(id(b))
b=9
print(id(a))
print(id(b))
print("++++++++++++++++++++++++++++++++++++")
a="hello"
b="hello"
print(a,b)
print(id(a))
print(id(b))
print("++++++++++++++++++++++++++++++++++++")
a=999
b=999
print(id(a))
print(id(b))
a="uu"
b=a
print(a,b)
print("++++++++++++++++++++++++++++++++++++")
a=None
print(a)
del a
print(a)
2.3删除变量

语法:del 变量名

注意:当一个变量被删除之后,该变量所占用的内存空间会被强制释放,同时相当于该变量未被定义

2.4变量类型转换

int:整型 float:浮点型 bool:布尔型 str:字符串

int(xx): 将xx转换为整型【重点掌握】

float(xx): 将xx转换为浮点型

str(xx): 将xx转换为字符串【重点掌握】

bool(xx):将xx转换为布尔型

bin(xx):将数值xx转换为二进制

hex(xx):将数值xx转换为十六进制

oct(xx):将数值xx转换为八进制

chr(xx):将xx整数转换为编码之后对应的一个字符

ord(xx):将xx字符转换为对应的编码的整数

2.4.1 练习1
a="10"
print(a,type(a))#10 <class 'str'>
a1=int(a)
print(a1,type(a1))#10 <class 'int'>
a="uu"
#a=int(a)#ValueError: invalid literal for int() with base 10: 'uu'
#print(a)
print("++++++++++++++++++++++++++++++++++++++")
a="9.9"
print(a,type(a))
a1=float(a)
print(a1,type(a1))
print("+++++++++++++++++str(xx);将xx转换为字符串【重点掌握】+++++++++++++++++++++")
a=10
a=str(a)
print(a,type(a))
a=[1,2,3]
a1=str(a)
print(a1,type(a1))
print("+++++++++++++++bool(xx):将xx转换为布尔型+++++++++++++++++++++")
#假【False】:0  0.0   ""  None  [] ()  {}
print(bool(8))
print(bool(0))
print(bool(0.0))
print(bool(""))
print(bool(None))
print(bool([1,2]))
print(bool([]))
print("+++++++++++++++++++++")
print(bool(()))
print(bool({1}))
print("++++++++++bin(xx):将数值xx转换为二进制++++++++++++++")
print(bin(9))
#print(bin("a"))#TypeError: 'str' object cannot be interpreted as an integer
print(bin(-9))
print("++++++++++++hex(xx):将数值xx转换为十六进制+++++++++++++++++++++")
print(hex(19))
print(hex(90))
print("++++++++++++oct(xx):将数值xx转换为八进制+++++++++++++++")
print(oct(9))
print(oct(90))
2.4.2 练习2 码值
print(ord("a"))
print(ord("z"))
print(ord("A"))
print(ord("Z"))
print(ord("0"))
print(ord("9"))
print(ord("*"))
print("++++++++++++++++++++++++++++")
print(chr(43))
print(chr(123))
print(chr(21320))
2.4.3 练习3 定义一个变量,该变量的值为任意小写字母,输出对应的大写字母
a="s"
juli=ord("a")-ord("A")#先算出大写与小写的距离
print(juli)
mazhi=ord(a)#算出小写字母的码值
print(mazhi)
mazhi_daxie = mazhi-juli#用小写字母的码值减去距离--得到大写的码值
daxie = chr(mazhi_daxie)
print(daxie)

五、输入输出【重点掌握】

1 print 输出
1.1 练习1
#print方法
print(10)
print(90,100)
print("hello "+"uu")
print(10+8)
#print("ww"+9)
print(1*10)
print("*"*10)
print("*"*100)
print("+++++++++++++++++++++++++++++++++++++")
a=2
b=3
print("%d + %d = %d" %(a,b,a+b))
print("%s + %s = %s" %(a,b,a+b))
print("++++++++++++++++++")
a=2.3
b=9.9
print("%f + %f = %f" %(a,b,a+b))
print("%.1f + %.1f = %.1f" %(a,b,a+b))
print("%.2f + %.2f = %.2f" %(a,b,a+b))
print("%d + %d = %d" %(a,b,int(a)+int(b)))
print("%s + %s = %s" %(a,b,a+b))
1.2 练习2 格式输出

%d 整数

%f 小数 %.nf 保留n位小数

%s 任意类型

""" 
姓名:刘备  年龄:30
"""
name="刘备"
age=30
print("姓名:%s  年龄:%d " %(name,age))
#print("%d" %(name))#TypeError: %d format: a number is required, not str
1.3 练习3

sep: 分隔符,默认值为空格,如果想要其他的分隔符,可以自定义【给sep变量重新赋值】

end: 如果想让print阻止换行,则可以end=""

#sep:分隔符,默认值为空格,如果想要其他的分隔符,可以自定义【给sep变量重新赋值】
print(2,3)
print(2,3,sep="++++")
print("+++++++++++++++++++++++++++++")
#3.end:结束符,默认值为\n,会进行自动换行,如果不想要换行,可以自定义【给end变量重新赋值】
#如果想让print阻止换行,则可以end=""
print(10,end=",")
print(20,end="")
print(" hehe")
print("+++++++++++++++++++++++++++")
print(1,2,3,sep="*****",end="++++")
print(" killer")
2 input 输入

语法:input(“提示文字”)

结果:输入完数据,按下回车键,则会解除阻塞,同时返回用户输入的数据

注意:不管在控制台上输入了什么类型的数据,通过input获取,获取的都是字符串

num=input("请输入一个数字:")
print(num)
print(type(num))
num=int(num)
print(type(num))
#需求:引导用户输入姓名和年龄,直接输出
#用户名 : mingzi   年龄 :100
name = input("请输入您的用户名:")
age = int(input("请输入您的年龄:"))
print("用户名:%s 年龄:%d" %(name,age))

六 运算符和表达式【第一部分】

1 表达式

表达式是由操作数和运算符组成的一句代码或者语句

作用:可以赋值,可以运算

例如:

2 + 3就是一个表达式,2和3是操作数,+是运算符

name = "zhangsan",zhangsan是操作数,=是运算符

2 运算符
2.1 算术运算符

+ - * / %(取余) **(次幂) //(取整)

a = 10
b = 3
print("a=%d b=%d" %(a,b))
print("%d+%d=%d"%(a,b,a+b))
print("%d-%d=%d"%(a,b,a-b))
print("%d*%d=%d"%(a,b,a*b))
print("%d/%d=%f"%(a,b,a/b))
print("%d/%d=%s"%(a,b,a//b))
print("%d余%d=%s"%(a,b,a%b))
print(2**3)
print("+++++++++++++++++++++++")
print(2*5**2)
print((2*5)**2)
2.2 赋值运算符

简单赋值运算符:=
作用:给一个变量进行赋值

复合赋值运算符:+= -= *= /= %= **= //=
作用:进行指定的运算,然后再给一个变量进行赋值

a=10
print(a)
a=a+10
print(a)
a+=10
print(a)
a**=2
print(a)
a=a**2
2.3 关系运算符

==:等于 !=:不等于 = < <=

注意:运算结束之后的结果肯定是一个布尔值【一个关系表达式的结果无非两种结果,要么成立:True,要么不成立:False】

使用场景:一般用于条件,结合if语句或者while语句使用

a=10
b=9
print("a=%d b=%d" % (a,b))
print(a==b)
print(a!=b)
print(a>b)
print(a>=b)
print(a<b)
2.4 位运算符【了解】
"""
&& || !   and or not
与   同时为真才是真 只要有一个假就是假
或   同时为假才是假  只要有一个真就是真
非   非真即假 非假即真
与   同时为1才是1 只要有一个0就是0
或   同时为0才是0  只要有一个1就是1
非   非0即1 非0即1
& :按位与    |:按位或
^:按位异或    ~:按位取反
<<:左移	   >>:右移

注意:&   |   ^【面试题】使用较多
"""
a = 10
b = 7
# 0000 1010
# 0000 0111
# 0000 0010
print(a & b)
# 0000 1010
# 0000 0111
# 0000 1111
print(a | b)
# 0000 1010
# 1111 0101---(?==-11)
# 0000 1010
#         1
# 0000 1011---11
print(~a)
print(~b)
#0000 0111
#1111 1000---(?)-8
#0000 0111
#0000 1000
#^:按位异或    相异为真 相同为假
#0000 1010
#0000 0111
#0000 1101
print(a^b)
print("+++++++++++++++++++++++++++++++++++")
#0000 1000
#0001 0000
a = 8
a <<= 4
print(a)
a >>= 5
print(a)
2.5 逻辑运算符

and or not ---- 与或非

a = True
b = False
print(a and a)
print(a and b)
print(b and a)
print(b and b)
print("++++++++++++++++++++++++")
a = 10
b = 3
luoji1 = a>=b and a>9
print(luoji1)
luoji2 = a>=b and a>100
print(luoji2)
print("+++++++++++++++++++++++++++++++++++")
luoji_or1 = a>b or a>900
print(luoji_or1)
luoji_or2 = a<=b or a>900
print(luoji_or2)
print("++++++++++++++++++++++++++++++++++")
luoji3 = not a>=b
print(luoji3)
luoji4 = not 100>900
print(luoji4)
print("========and的优先级高于or====")
luoji5 = 8>7 and 3>9 or 80>9 and 9<90
print(luoji5)
luoji6 = 8>7 and 3>9 or 8>9 and 9<90 or not False
print(luoji6)

七 分支语句之if语句【重点掌握】

Python中的语句分为两大类:分支语句和循环语句

分支语句【条件控制语句】:if语句,根据不同的条件执行不同的语句

循环语句:while语句,for语句

1 单分支【简单if语句】

语法:

​ if 表达式:

​ 语句块

说明:

​ a.作用:根据条件是否成立决定语句是否执行【要么执行,要么不执行】

​ b.表达式可以是常量,变量或者运算符【关系运算符】

​ c.区分if语句的代码使用的缩进【一定要注意缩进,标准写法为四个空格】

if False:
    print("====这是真的====")
    print("====这是一个缩进语句块====")
print("++++++++++++++0 0.0 False None  [] () {} ++++++++++++++++++++++")
print("====a>10  b<9   =====")
if 1:
    print("===分支007===")
a=10
if a>9:
    print("===a大于9===")
if a>=1 and a<=100:
    print("a在1--100之间==")
if a>=10:
    print("a大于等于10")
print("======over++++++")
2 双分支【if-else语句】

语法:

​ if 表达式:

​ 语句1

​ else:

​ 语句2

说明:

​ 进行了二选一的操作,如果条件成立,则执行语句1,如果条件不成立,则执行语句2

a = 11
if a % 2 == 0:
    print("%d 是偶数" % (a))
else:
    print("%d 不是偶数" %(a))
day = int(input("请输入这个月的第几天:"))
if day>=10 and day<=20:
    print("%d 在月中" %(day))
else:
    print("%d 不在月中" %(day))
#2.需求:从控制台输入一个年龄,输出对应的范围
age = int(input("请输入您的年龄:"))
if age >=18:
    print("===你已成年==")
else:
    print("===你是未成年=====")
3 多分支【if-elif-elif…-else】
#   chnegji   90 A 80 B 70 C 60 D  不及格
cheng_ji = int(input("请输入一个成绩:"))
#0-100
if cheng_ji >=0 and cheng_ji <= 100:
    if cheng_ji >= 90:
        print("A")
    elif cheng_ji >= 80:
        print("B")
    elif cheng_ji >= 70:
        print("C")
    elif cheng_ji >= 60:
        print("D")
    else:
        print("不及格")
else:
    print("====成绩无效====")
4 三者的区别

多分支:多选一

单分支:要么执行,要么不执行

双分支:二选一

八 运算符和表达式【重点掌握】

1.逻辑运算符

逻辑运算符就是用来进行逻辑运算的,为了和条件运算符结合使用,运算的结果可以作为条件使用【真假】

运算符:and【逻辑与】 or【逻辑或】 not【逻辑非】

2.成员运算符

in :判断一个数据在一个指定容器【可迭代对象】中是否存在,如果存在,则返回True

not in:判断一个数据在一个指定容器【可迭代对象】中是否不存在,如果不存在,则返回True

list1 = [1,2,3]
num = 22
if num in list1:
    print("含有")
else:
    print("不含有")
print("++++++++++++++++++++++++++")
list2 = [9,8,7,10]
num2 = 99
if num2 not in list2:
    print("===不在===")
else:
    print("====在里面====")
3.身份运算符

is:判断两个标识符是否引用自同一个实体【实质:判断两个变量的地址是否相同】

is not:判断两个标识符是否引用自不同的的实体

a = 10
b = 10
a = "hello"
b = "hello"
a = True
b = 1

if a is b:
    print("a is b")
else:
    print("a is not b")
print(id(a))
print(id(b))
print("++++++++++++++=== ==++++++++++++++++")
a = "1"
b = 1
print(a == b)
print(a is b)
print("+++++++++++++++++++++++++")
3.1 简述is和==的区别

is:比较的两个变量的地址
==:比较的是两个变量的值【内容】

九 循环语句之while语句【重点掌握】

1.概念

在满足条件的情况下,反复执行某一段代码,在编程语言中出现的这种现象称为循环,某段被重复执行的代码被称为循环体

2.while语句的使用
2.1基本使用

语法:

​ while 条件:

​ 循环体

说明:while语句和if语句的区别:在条件成立的前提下,if语句只会执行一次,但是while语句至少执行一次

工作原理:在代码执行的过程中,遇到while语句,首先判断条件是否成立,如果不成立,则直接跳过整个while语句,继续执行后面的代码;如果条件成立,则执行while代码块中的代码,执行完之后再次判断条件是否成立,。。。。如此循环往复,直到条件为假,则整个循环才会结束,机修执行后面的代码

2.1.1 练习1
#循环的初始值
i = 1
while i <= 10:
    print("====hello uu=====")
    i += 1
print("=====over=====")
2.1.2 练习2 :完成1-100之间偶数的和
sum = 0#定义一个变量来接收和
i = 1#定义一个循环初始值
while i <= 100:
    if i % 2 == 0:
        sum += i
    i += 1
print("==1-100之间偶数的和==%s" % sum)
2.2else分支

语法:

​ while 条件:

​ 循环体

​ else:

​ 语句

注意:else可以省略

sum = 0
i = 1
while i <= 5:
    sum += i
    i += 1
else:
    print(i)
    print("=====循环条件不满足了===")
print("====sum=%s" % sum)
2.3 死循环
"""
死循环
"""
while 1:
    print("hehe")
2.4 嵌套循环
2.4.1 练习1

while 条件:
while 条件:
执行语句
外循环

wai = 1
while wai <= 3:
    nei = 1
    while nei <= 3:
        print("%s---%s\t" %(wai,nei),end="")
        nei += 1
    wai += 1
    print()
2.4.2 练习2
"""
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
"""
i = 1
while i <= 5:
    j = 1
    while j <= 5:
        print("* ",end="")
        j += 1
    i += 1
    print()
2.4.3 练习3
"""
             i       j
* * * * *    1      12345
* * * *      2      1234
* * *        3      123
* *          4      12
*            5      1
j = 1  j <= 6-i
"""
i = 1
while i <= 5:
    j = 1
    while j <= 6-i:
        print("* ",end="")
        j += 1
    i += 1
    print()
2.4.4 练习4
"""
               i      j
*
* *
* * *
* * * *
* * * * *
j<=i
"""
i = 1
while i <= 5:
    #完成每一行的内容
    j = 1
    while j <= i:
        print("* ",end="")
        j += 1
    i += 1#打印完一行就换行
    print()#打印完一行就换行
print("+++++++++++++++++++++++++++++++++++++++=")
"""
1
12
123
1234
12345
"""
i = 1
while i <= 5:
    j = 1
    while j <= i:
        print(j,end="")
        j += 1
    i += 1
    print()
"""
1*1=1
1*2=2   2*2=4
1*3=3   2*3=6   3*3=9
1*4=4   2*4=8   3*4=12  4*4=16
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81
"""
print("++++++++++++++++++++++++++++++++++++++++++++++++")
i = 1
while i <= 9:
    j = 1
    while j <= i:
        print("%d * %d = %d\t " %(j,i,i*j),end="")
        j += 1
    i += 1
    print()
2.4.5 练习5:三角形
"""
    *
   * *
  * * *
 * * * *
* * * * *
    *
   **
  ***
 ****
*****
j>=6-i
"""
i = 1
while i <= 5:
    j = 1
    while j <= 5:
        if j >= 6-i:
            print("* ",end="")
        else:
            print(" ",end="")
        j += 1
    i += 1
    print()
2.4.6 练习6:菱形
"""
    *
   * *
  * * *
 * * * *
* * * * *
 * * * *
  * * *
   * *
    *
    *
   **
  ***
 ****
*****
         i     j
 ****    6     >=2
  ***    7     >=3
   **    8     >=4
    *    9     >=5
"""
i = 1
while i <= 9:
    if i <= 5:
        j = 1
        while j <= 5:
            if j >= 6 - i:
                print("* ",end="")
            else:
                print(" ",end="")
            j += 1
    else:
        k = 1
        while k <= 5:
            if k >= i - 4:
                print("* ", end="")
            else:
                print(" ", end="")
            k += 1
    i += 1
    print()
2.4.7 练习7:
"""
1    1    1
  2  2    2
3 3  3  3 3
  4  4    4
5    5    5
"""
#五行五列  i 1-5  j 1-5
i = 1
while i <= 5:
    j = 1
    while j <= 5:
        if i == 3 or j == 3 or j == 5 or j==1 and (i==1 or i==5) or j==2 and (i==2 or i==4):
            print("%d "% i ,end="")
        else:
            print("  ",end="")
        j += 1
    i += 1
    print()
2.4.8 练习8

求100以内的质数 2----100内循环就是判断当前数字是不是质数

标志位 isZhi

i = 2
while i <= 100:
    #定义一个标志位 标识这个数字是不是质数  初始值定义为真
    isZhi = True
    j = 2
    while j < i:
        #除以所有小于自己的数字 如果有除尽的 就说明其不是质数
        if i % j == 0:#说明除尽了
            isZhi = False
            break#跳出当前循环 意思是已经不是了就不用继续循环了
        j += 1
    if isZhi:
        print("%d 是质数" % i)
    i += 1
2.4.9 练习9

一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程 找出1000以内的所有完数。

i = 2
while i <= 1000:
    #判断i是不是完数  先要算出一个因子之和
    sum = 0
    #一个数的因子就是比他小的数可以除尽的数
    j = 1
    while j < i:
        if i % j == 0:
            sum += j#如果除尽了 说明是因子 加到因子之和
        j += 1
    #判断因子之和是不是自己
    if i == sum:
        print(i,end=",")
    i += 1

十 list 列表

列表的元素可以重复

1 列表的定义
list1 = []
print(list1)
print(type(list1))#<class 'list'>
if not list1:
    print("===空列表====")
print("++++++++++++++++++++++")
print(len(list1))
2 创建列表

创建列表其实就是定义一个列表类型的变量

语法:

​ 变量名 = 值

​ 列表名 = [数据1,数据2…]

说明:

​ a.使用[]表示列表

​ b.列表中存储的数据被称为元素

​ c.列表中的元素被自动的从头到尾做了编号,编号从0开始,这些编号被称为索引,下标或者角标

​ d.索引的取值范围:0 ~ 元素的个数 - 1

​ e.问题:如果超过索引的范围,则会报错【下标越界:IndexError】

2.1 列表的基本操作 — 下标
list1 = [1,2,33,90]
print(list1)
print(len(list1))
print(list1[2])
print(list1[0])
#0 -- len -1
print("==========用while遍历一下这个数组====")
index = 0
while index < len(list1):
    print(list1[index],end=",")
    index += 1
2.1.2 元素类型
list1 = [1,"hello",9.9,True]
print(list1)
print(list1[3])
i = 0
print("+++++++++++++++++++++++++++=")
while i < len(list1):
    print(list1[i],end=",")
    i += 1
3.列表的访问

a.获取元素

b.修改元素

list1 = [1,2,3,4]
print(list1)
print(list1[2])
print("++++++ 0 - len-1++++++")
print("======倒叙的获取==========-1   - len====")
print(list1[-1])
print(list1[-len(list1)])
"""
0  -len
1 -len+1
"""
print("======下标越界++++++++++")
#print(list1[10])#IndexError: list index out of range
#print(list1[-10])#IndexError: list index out of range
print(list1)
list1[0] = 11
list1[1] = 22
list1[2] = 33
list1[3] = 44
print(list1)
print("+++++++++++++++++++++++++++")
print(id(list1))
print(id(list1[0]))
print("++++++++++++++++++++++++++++++++++++++++")
list2 = [1,2,3]
list3 = [90,80,70]
print(list2)
print(list3)
list2 = list3
print(list2)
print(list3)
print(id(list2))
print(id(list3))
4.列表的操作

a.列表组合:+

b.列表元素的重复:*

c.判断元素在列表中是否存在:成员运算符

4.1 操作1
list1 = [1,2,3]
list2 = ["张飞","刘备","关羽"]
he = list1 + list2
print(list1)
print(list2)
print(he)
print("++++++++++++++++++++++++++++++")
list3 = list2 * 3
print(list3)
print("+++++++++++++++++++++++++++")
name = "张飞"
if name in list2:
    print("有张飞")
else:
    print("张飞走了")
name = "曹操"
if name not in list2:
    print("没曹操")
else:
    print("有曹操")
print("+++++++++++++++++++")
list4 = ["黛玉","宝玉"]
kaobei = list4 * 4
print(list4)
print(kaobei)
4.2 切片(截取)

【面试题:什么是列表切片?请举例说明】
概念:从一个指定的列表中根据具体的条件获取列表中的部分元素,形成一个新的列表
具体的条件:根据区间和步长确定需要获取的元素

语法:
列表名[索引] :获取列表中执行索引对应的元素
列表名[start:end:step]:获取指定区间内的元素
start:表示区间的开始,可以省略,默认为0
end:表示区间的结束,可以省略,默认为最后一个元素的下标
step:表示索引的步长,可以省略,默认为1

4.2.1 正向
list1 = [0,1,2,3,4,5,6,7]
print(list1)
print(list1[3])
print(list1[1:3])
print(list1[3:5])
print(list1[:])
print(list1[:5])
print(list1[4:])
print(list1[2:6])
print("++++++++++++++++++改变步长+++++++++++++++++++++")
print(list1[::])
print(list1[::2])
print(list1[1::2])
print(list1[::3])
print(list1[1:6:2])
4.2.2 反向

step 为正数 意思是从前往后

step是负数 意思是从后往前取

list1 = [0,1,2,3,4,5,6,7]
print(list1)
print("++++++++++++++++++++++++++++++++++++++")
print(list1[::1])
print(list1[::-1])
print("*************************")
print(list1[6:1:1])
print(list1[6:1:-1])
print("++++++++++++++++++++++++++")
print(list1[-1:-4:-1])
print(list1[-6::-1])
print(list1[::-2])
print(list1[-2::-2])
4.2.3 可以使用循环遍历的方式实现切片功能
list1 = [0,1,2,3,4,5,6,7]
print(list1)
print("+++++++++++正向遍历====")
i = 0
while i < len(list1):
    print(list1[i],end=",")
    i += 1
print()
print("+++++++++++反向遍历====")
i = -1
while i >= -len(list1):
    print(list1[i],end=",")
    i -= 1
print()
print("+++++跳着取====")
i = 0
while i < len(list1):
    print(list1[i],end=",")
    i += 2
print()
print()
print("+++++++++++反向遍历跳====")
i = -1
while i >= -len(list1):
    print(list1[i],end=",")
    i -= 2
print()
4.2.4 练习
list1 = ["宝玉","黛玉","宝钗"]
print(list1)
print("++++++++++++")
print(list1[::])
print(list1[::-1])#倒序取
print(list1[1:2:1])
print(list1[-2:-3:-1])
print(list1[::2])
print(list1[::-2])
"""
逆向
"""
list1 = [1,2,3,4,5]
print(list1)
print("+++++++++++++++++++++++++")
print(list1[4:2:-1])
print(list1[-4:-2:1])
4.2.4
list1 = ["a","b","c","d","e","f"]  #0~5   -1~-6
#bcd
print(list1[1:4])
print(list1[-5:-2:1])
#bcdef
print(list1[1:6])
#abcd
print(list1[:4])

# bd
print(list1[1:4:2])
#[]
print(list1[9:5:1])
 #[]
#fed
print(list1[:-4:-1])
#[]
#cde
print(list1[2:5:1])

#fedcba
print(list1[::-1])
#abcde
print(list1[:5])
#bcdef
print(list1[1:])
 #bdf
print(list1[1::2])
5.列表功能【基础】
5.1 len() 列表的长度
list1 = [2,3,4,5,6]
print(list1)
print(len(list1))
5.2 append() 追加,向列表的末尾追加元素

格式:列表.append(xx),

注意: 使用append向列表中追加元素,一次只能追加一个元素,如果有多个元素,则以容器的方式追加

list1 = [2,3,4,5,6]
list1.append(10)
print(list1)
list1.append("abc")
print(list1)
list1.append([99,88,77])
print(list1)#[2, 3, 4, 5, 6, 10, 'abc', [99, 88, 77]]
5.3 remove() 移除,删除列表中指定元素【操作元素】

格式:列表.remove(xx)

注意:remove一次只能移除一个元素【从左往右进行匹配】

list1 = [2,3,4,5,6]
list1.append(2)
print(list1)
list1.remove(2)
print(list1)
move2 = list1.remove(2)
print(move2)
print(list1)
5.4 pop() 弹出,从列表中删除指定元素

如果不指明索引,则默认删除最后一个元素

pop1 = list1.pop()
print(pop1)
print(list1)
pop2 = list1.pop(4)#4是移除元素的下标
print(pop2)
print(list1)
print("+++++++++++++++++++++++++++++++++++++++++++++++++")
5.5 count() 个数,统计一个元素在列表中出现的次数
list2 = [2,3,2,3,2,3,2,3]
print(list2)
count2 = list2.count(2)
print(count2)
print("============删除所有的2=========")
i = 0
while i < count2:
    list2.remove(2)
    i +=1
print(list2)
5.6 练习:对一个列表中的元素进行奇偶数分离
#list1 = [32,54,5,4,64,65,100,16,7]----->[偶数]  [奇数]
list1 = [32,54,5,4,64,65,100,16,7]
print(list1)
ji_list = []
ou_list = []
i = 0
while i < len(list1):#遍历这个列表
    yuansu = list1[i]#获取当前元素
    if yuansu % 2 == 0:
        ou_list.append(yuansu)
    else:
        ji_list.append(yuansu)
    i += 1
print(ji_list)
print(ou_list)
6.二维列表
6.1 列表的元素还是列表

规则的 [[1 2 3],[4,5,6],[7,8,9]]

不规则的 [[1],[2,3],[4,5,6]]

list1 = [[1,2,3],[4,5,6],[7,8,9]]
print(list1)
print(list1[0])
i = 0
while i < len(list1[0]):
    print(list1[0][i],end=",")
    i += 1
print()
print("+++++++++++++++++")
print(list1[1])
i = 0
while i < len(list1[1]):
    print(list1[1][i],end=",")
    i += 1
print()
print("++++++++++++++++++++++++++++++")
print(list1[2])
i = 0
while i < len(list1[2]):
    print(list1[2][i],end=",")
    i += 1
print()
print("++++++++++++++++++++++++++++++++++++++++++++++++++++")
#外循环控制遍历二维  内循环控制遍历内部列表
i = 0
while i < len(list1):#i表示是第几个内部列表
    #list1[i]  0 === len-1
    j = 0
    while j < len(list1[i]):#j表示是内部列表的第几个元素
        print(list1[i][j],end=",")
        j += 1
    i += 1
    print()
6.2 二维列表的操作
names = [["悟空","八戒","唐僧"],["宝玉","黛玉"],["宋江","燕青","林冲","武松"]]
print(names)
print(names[2][1])
print(names[1][1])
names[1][0] = "宝钗"
print(names)
print("++++++++++++++++++++++++++++++++++++++++++++")
i = 0
while i < len(names):
    #names[i] --- 第几组名字
    j = 0
    while j < len(names[i]):
        print(names[i][j],end=",")
        j += 1
    i += 1
    print()

十一 for循环【重点掌握】

1.定义及基本使用

语法:

for 变量名 in 容器:

​ 循环体

说明:for-in语句专门用来获取容器中的元素,in是成员运算符,在获取元素的过程中同时做了判断

工作原理:for循环用于遍历容器【遍历:依次访问列表中的每一个元素,获取元素值】,按照顺序获取列表中的元素,赋值给变量,再执行语句,如此循环往复,直到列表中的元素全部遍历完毕,整个循环会自动停止

list1 = [1,2,3,4,5]
print(list1)
for ele in list1:
    print(ele,end=",")
print("+++++++++++++++++++++++")
list1=["刘备","关羽","曹操"]
for ele in list1:
    print(ele,end=",")
2 range()

range(start,end,step)

  • start:可以省略,默认为0

  • end:不能省略

  • step:步长,可以省略,默认为1

2.1 基本用法
range1 = range(10)
print(range1)
for i in range1:
    print(i,end=",")
print("+++++++++++++++++++++++++")
range2 = range(1,10)
for i in range2:
    print(i,end=",")
print("++++++++++++++++++++++")
range3 = range(1,10,2)
for i in range3:
    print(i,end=",")
print("++++++++++++++++++++++++++++")
range4 = range(2,10,2)
for i in range4:
    print(i,end=",")
print("++++++++++++1--表示从小到大   -1  表示从大到小++++++++++++++++++++")
for i in range(8,1,-1):
    print(i,end=",")
print("++++++++++++++++++++++")
list1 = [90,80,70,60]
for i in range(len(list1)-1,-1,-1):
    print(list1[i],end=",")
print("++++++++++++++++++")
for i in range(-1,-len(list1)-1,-1):
    print(list1[i],end=",")
2.2 range – list
list1 = [1,2,3,4,5]
#        0 1 2 3 4
range1 = range(len(list1))
for i in range1:
    print(i,end=",")
print("++++++++++++++++++++++++++++++")
for i in range(len(list1)):
    #下标 i list1[i]
    print("第 %d 个是 %s" %(i+1,list1[i]))
2.3 求一个值在列表中的位置
list1 = [11,2,33,90,100,88]
key = 2
for i in range(len(list1)):
    if list1[i] == key:
        print(i)
2.4 求列表的最大值及其位置
list1 = [9,99,10,20,30,888,90]
print(list1)
max1 = list1[0]
for ele in list1:
    if ele > max1:
        max1 = ele
print(max1)
print("++++++++++++++++++++++")
for i in range(len(list1)):
    if list1[i] == max1:
        print(i)
2.5
"""
练习
 1.打印数字列表中的偶数元素
 2.打印列表中下标为偶数的元素
"""
list1 = [11,2,33,44,900,89,7]
print(list1)
for ele in list1:
    if ele % 2 == 0:
        print(ele,end=",")
print("++++++++++++++++++++++++++++++++++")
for i in range(0,len(list1),2):
    print(list1[i],end=",")
3.遍历列表
3.1 enumerate(list1) : 将一个列表转换成枚举对象
list1 = [1,22,33,90]
for i,ele in enumerate(list1):
    print(i,ele,sep="=====")
print("++++++++++++++++++++++++")
for i in range(len(list1)):
    print(i,end="------")
    print(list1[i])
4.嵌套for循环
4.1 打印正方形和三角形
"""
*****
*****
*****
*****
*****
"""
for i in range(1,6):
    for j in range(1,6):
        print("*",end="")
    print()
print("+++++++++++++++++++")
"""
*
**
***
****
*****

"""
for i in range(1,6):
    for j in range(1,i+1):
        print("*",end="")
    print()
print("++++++++++++++++++++++++++")
for i in range(1,10):
    for j in range(1,i+1):
        print("%d * %d = %d \t" % (j,i ,i*j),end="")
    print()
4.2 打印菱形
"""
  七行七列        i          j        j左       j右
     *           1          4         4         4
    ***          2         345        3         5
   *****         3        23456       2         6
  *******        4       1234567      1         7
                                    >=5-i      <=i+3
   *****         5        23456       2         6
    ***          6         345        3         5
     *           7          4         4         4
                                    >=i-3      <=11-i
"""
for i in range(1,8):
    for j in range(1,8):
        if i <= 4:
            if j>=5-i and j <=i+3:
                print("*",end="")
            else:
                print(" ",end="")
        else:
            if j >=i-3 and j <= 11-i:
                print("*",end="")
            else:
                print(" ",end="")
    print()
4.3 遍历二维
#1.
list1 = [[1,2,3],[22,33],[99,88,199]]
for ele in list1:
    #print(ele)
    for ele1 in ele:
        print(ele1,end=",")
    print()
print("+++++++++++++++++++++++++++++++")
max1 = list1[0][0]
for ele in list1:
    for ele1 in ele:
        if ele1 > max1:
            max1 = ele1
print(max1)
#2.
list1 = [[1,2,3],[4,5,6,656],["aaa",True]]
#遍历这个列表
for ele in list1:
    for ele1 in ele:
        print(ele1,end=",")
    print()

十二 break和continue和pass语句【重点掌握】

注意:break和continue是关键字,可以单独作为一条语句使用

【面试题:说明break和continue的作用,举例说明】

break:直接结束当前循环

continue:结束当前正在执行的循环,继续下一次循环

1 break 语句
#1.
for i in range(5):
    if i ==3 :
        break
    print(i,end=",")
print("++++++++++++++++++++")
#2.应用在死循环
"""
需求:猜数字游戏
计算机随机出一个1~100之间的数由人来猜
计算机根据人猜的结果给出提示:大一点,小一点,猜中了
"""
num = 77
count = 0
while True:
    cai_num = int(input("请输入您猜的数字:"))
    if cai_num > num:
        print("大了")
    elif cai_num < num:
        print("小了")
    else:
        print("===恭喜你 猜中了")
        break
    count += 1
    if count >= 7:
        print("呵呵 game over")
        break
2 continue 语句
for i in range(5):
    if i==3 :
        continue
    print(i,end=",")
print("++++++++++++++++++++++++++++")
names = ["曹操","刘备","孙权","赵云","貂蝉"]
print(names)
for ele in names:
    if ele == "孙权":
        continue
    print(ele,end=",")
3 pass 语句

Python中pass语句是空语句,是为了保持程序结构的完整性

pass一般不做任何事情,一般用作占位语句,只是为了防止语法错误,一般使用在if,while,函数,类等代码块中

十三 list功能

1 增加

append:追加,在列表的末尾追加元素

  • 追加单个元素

  • 如果通过append向列表中追加多个元素,则以容器的方式追加,但是,会将整个容器追加进去

extend:扩展,在列表的末尾追加元素

  • 追加单个元素
  • 多个,可迭代对象:能用for循环遍历的数据类型对应的变量,有list,tuple.dict,set,str

insert:插入,在列表的指定位置插入指定元素,后面的其他元素向后顺延,语法:列表名.insert(索引,元素)

  • 单个
  • 多个
1.1 append
list1 = [1,2,3]
print(list1)
list1.append(10)
print(list1)
#list1.append(20,30)#TypeError: append() takes exactly one argument (2 given)
list1.append([20,30])
print(list1)
print("+++++++++++++++++iterable ++list,tuple.dict,set,str等+++++")
1.2 extend 追加
list1 = [1,2,3]
#list1.extend(10)#TypeError: 'int' object is not iterable
list1.extend([10])
print(list1)
list1.extend([100,900,1000])
print(list1)#[1, 2, 3, 10, 100, 900, 1000]
list1.extend("hehe")
print(list1)
1.3 insert
list1 = [1,2,3,4,5]
print(list1)
list1.append(99)
print(list1)
list1.insert(2,22)#2的意思是添加的位置  22 是添加的元素
print(list1)
list1.insert(4,88)
print(list1)
print("+++++++++++++++++")
list1.insert(1,[888,999])
print(list1)
list1.clear()#清空列表内容
print(list1)
2 删除

pop:操作索引,返回被删除的元素

remove:操作元素,remove返回None

clear:清除,将指定的列表清空,可以使用在tuple,dict,set,原列表变成空列表

list1 = [1,2,3,4,5]
#1.pop
pop1 = list1.pop()   #移除最后一个元素
print(pop1)
print(list1)
list1.pop(1) #根据下标来删除
print(list1)  
#2.remove
list1 = [11, 22, 55, 33, 44]#根据对象值来删除
list1.remove(22)
print(list1)
#3.clear
list1.clear()#清空列表内容
print(list1)
3 修改

reverse、append、切片、sort、

3.1 reverse:反转,将原列表倒序 ; append 添加;切片
list1 = [11,22,33,44]
print(list1)
list1.reverse()#列表发生改变
print(list1)
print("+++++++++++++++++++++++++++++++")
list2 = [11,22,33,44]
print(list2)
list3 = list2[::-1]
print(list3)
print(list2)
print("+++++++++++++++++++++++++++++++")
list4 = []
for i in range(-1,-5,-1):
    list4.append(list2[i])
print(list4)
print(list2)
print("+++++++++++++++++++++++++++++++")
list4 = []
for i in range(3,-1,-1):
    list4.append(list2[i])
print(list4)
print(list2)
3.2 sort:排序,默认升序

降序,reverse=True

list1 = [22,3,45,9,1]
print(list1)
list1.sort()
print(list1)
#想改变排序规则  使用reverse=True
list1.sort(reverse=True)
print(list1)
#有时候不想使用自然排序
#对于字符串来说自然排序是指字典顺序
names = ["ss","hello","air","uukiller","x","like"]
print(names)
names.sort()
print(names)
#要求以字符串的长度来进行排序
names.sort(key=len)#根据长度的升序排序
print(names)
names.sort(key=len,reverse=True)#key是排序规则  reverse=True=是降序
print(names)
4 查看

len(list):获取列表的长度

count(元素):统计一个指定元素在列表中出现的次数

max(list)、min(list):获取列表中的最值

index(元素),获取指定元素在列表中的位置【索引值】

#1.len:获取列表的长度
list1 = [1,2,34,99,100,999,2,3,2]
print(list1)
print(len(list1))
##2.count:统计一个指定元素在列表中出现的次数
print(list1.count(2))
print("+++++++++++++++++++++++++")
count = list1.count(2)
for i in range(len(list1)):
    if list1[i] == 2:
        print(i,end=",")
print(count)
print("+++++++++++++++++++++++++++++++")
#3.max、min:获取列表中的最值
print(max(list1))
print(min(list1))
print("+++++++++++++++++++++++++++++++=")
#4.index,获取指定元素在列表中的位置【索引值】
#注意:只返回第一个匹配到的元素的下标
print(list1)
num = 99
print(list1.index(num))
print("++++++")
num = 2
count = list1.count(num)
print(count)
#找一个元素的时候 一个是num  一个是从什么地方开始
index = 0
for i in range(count):#找三次  0 1 2
    weizhi = list1.index(num,index)
    print("第 %d 个所在位置 %d" % (i+1,weizhi))
    index = weizhi + 1
5 copy 拷贝
list1 = [1,2,3]
list2 = list1.copy()#copy出来的地址不同 内容相同
print(list1)
print(list2)
print(id(list2))
print(id(list1))
list1[1] = 99
print(list1)
print(list2)

十四 tuple元组

1.概述

和列表相似,本质上是一种有序的集合

元组和列表的不同之处:

​ a.表示,list:[] tuple:()

​ b.列表中的元素可以进行增加和删除的操作【列表是可变的】,但是,元组中的元素不能进行随意的更改【元组是不可变的:一旦被初始化,将不能进行改变】

# 创建元组
list1 = [1,2,2,3]
print(list1)
print(type(list1))
print("+++++++++++++++++++++++++++")
tuple1 = (1,2,2,3)
print(tuple1)
print(type(tuple1))#<class 'tuple'>
tuple2 = (1,"ww",True)
print(tuple2)
tuple3 = (10)
print(type(tuple3))#<class 'int'>
tuple4 = (10,)
print(type(tuple4))#<class 'tuple'>
2.访问元组,元组不可变

【面试题:list和tuple的区别】

  • 1.list是可变的【其中的元素可以增加,删除或者修改】,tuple是不可变的,在多线程的环境下,更需要的是不可变的数据类型,可以避免由于多个线程同时访问同一个数据造成的数据混乱,使用元组比使用列表安全
  • 2.元组在创建时间和占用的空间上优化于列表
tuple1 = (1,2,3,4)
print(tuple1)
print(tuple1[1])
print("++++++++++++++++++++++++")
for ele in tuple1:
    print(ele,end=",")
print("")
#tuple1[1] = 99#TypeError: 'tuple' object does not support item assignment
3.元组功能

len,max,min,count

tuple1 = (1,2,3,499,3,3)
print(tuple1)
print(len(tuple1))#长度
print(max(tuple1))#最大值
print(min(tuple1))#最小值
print(tuple1.count(3))#3有几个
print("++++++++++++列表和元组的相互转化++++++++++++++++++++++++=")
list1 = list(tuple1)
print(list1)
list1[3] = 888
print(list1)
tuple1 = tuple(list1)
print(tuple1)
4.元组的遍历
"""
四种遍历方式
"""
#下标遍历
tuple1 = (1,2,99,90,7)
i = 0
while i < len(tuple1):
    print(tuple1[i],end=",")
    i += 1
print()
#for in
for ele in tuple1:
    print(ele,end=",")
print()
#for i 可以获取到下标
for i in range(len(tuple1)):
    print(tuple1[i],end=",")
print()
#枚举
for i,value in enumerate(tuple1):
    print(i,end="----")
    print(value)
5.二维元组
"""
元组的元素还是元组
"""
names = (("aa","cc","qq"),("killer","uu"),("pike","like"))
print(names)
print(names[1][0])
print("++++++++++++++++++++++++++++")
for ele in names:
    #ele--第几个
    for ele1 in ele:
        print(ele1,end=",")
    print()

十五、dict 字典

key的特性

  • a.字典中的key是不允许重复的【key是唯一的】
    要求唯一,不可变的
  • b.key的类型必须是不可变的
    • 可变的:list,dict,set,不能作为字典中key [1,2,3] [1,2,3]
    • 不可变:tuple,str,int,float,可以充当字典中的key (1,2,3) “hello” 10 9.9
1.字典的创建
#字典的创建
dict1 = {}
print(dict1)
print(type(dict1))#<class 'dict'>
dict1 = {"qq":90,"ww":99,"ss":9,"uu":88}
print(dict1)
print(len(dict1))#4---有四对值
print("++++++++++++++++++++++++++++++")
#dict1 = {[1,2]:90,[3,4]:80}#TypeError: unhashable type: 'list'
#hash --- 哈希值---地址  哈希地址   可变类型 list 不能作为字典的键
#print(dict1)
2.字典的使用

获取对应的value

  • 字典名[key],通过指定的key获取对应的value
  • 字典名.get(key)

pop(key) 通过键删除键值对

""" 
字典的使用
键值对   所有的操作都是以键为标准
"""
dict1 = {"刘备":90,"赵云":80}
print(dict1)
#语法:字典名[key],通过指定的key获取对应的value
name= "刘备"
score = dict1.get(name)#根据键来获取值
print(score)
print("++++++++++++++++++++++++++++++++")
print(dict1["赵云"])
print(dict1["刘备"])
#print(dict1["刘禅"])
print("++++++++++++++++++++++++判断含有不含有键+++++++++++++++++++++++++")
print(dict1.get("赵赵"))
name = "赵云"
if name in dict1:
    print(dict1.get(name))
print("++++++++++++++++++++++字典的修改++++++++++++++++++++++")
print(dict1)
dict1["赵云"] = 98#根据键来修改值
print(dict1)
dict1["曹操"] = 88#如果没有 就新添加
print(dict1)
print("++++++++++++=字典的删除++++++++++++++++++++++++++++==")
#3.删除
#pop(key),类似于list中的pop(index)
print(dict1)
shanchu = dict1.pop("刘备")#pop返回值是被删除的值  删除的是键值对整体
print(shanchu)
print(dict1)
3.dict(),字典的多种创建方式

类似于list(),tuple(),将其他的数据类型转换为字典类型

zip:映射

##a。key=value关键字
dict1 = dict(a=1,b=2,c=90)
print(dict1)
#b.zip:映射
dict1 = dict(zip(['a','b','c'],[90,80,70]))#对应位置映射
print(dict1)
print("+++++++++++++++++++++")
name_list = ["黛玉","宝玉","晴雯","袭人"]
score_list = [99,89,88,90]
dict1 = dict(zip(name_list,score_list))
print(dict1)
print("++++++++++++++++++++++++++")
dict1 = dict([('qq',90),('ww',100),('ss',80)])
print(dict1)
print("++++++++++++++++++++++")
dict1 = {}
dict1['qq'] = 100
dict1['ww'] = 90
dict1['xx'] = 80
print(dict1)
print("_________________________")
name_list = ["黛玉","宝玉","晴雯","袭人"]
score_list = [99,89,88,90]
score_dict = {}
for i in range(len(name_list)):#0 1 2 3
    #i  将namelist的值作为键  将scorelist的值作为字典的值
    score_dict[name_list[i]] = score_list[i]
print(score_dict)
4.字典的增删改查
dict1 = {"qq":90,"uu":80,"vv":70}
print(dict1)
dict1["ds"] = 80
print(dict1)
qq_zhi = dict1.pop("qq")
print(qq_zhi)
print(dict1)
dict1["uu"] = 100
print(dict1)
print("++++++++++++++++++++")
print(dict1["uu"])
print(dict1.get("uu"))
5.字典的遍历

字典名.keys()–获取指定字典中所有的key

字典名.values() – 获取字典中所有的value

字典名.itmes() — 用在for循环中,同时获取键和值

dict1 = {"qq":20,"ww":26,"uu":19}
print(dict1)
print("++++++++++#1.只获取key ++++++++++++++++")
for key in dict1:
    print(key,dict1.get(key))
print("++++++++++#2. 只获取key  ,keys()获取指定字典中所有的key++++++++++++++")
keys = dict1.keys()
print(keys)
for key in dict1.keys():
    print(key, dict1.get(key))
print("+++++++++++#3.只获取value,values()获取指定字典中所有的value====")
values = dict1.values()#获取字典中所有的值
for value in values:
    print(value)
print("++++++++++++++++++++")
for i,key in enumerate(dict1):
    print(i,key,dict1.get(key))
print("++++++++++++++++++++++++++++++++++++")
for key,value in dict1.items():
    print(key,value)
6.字典的练习
6.1 练习1

已知列表list1 = [0,1,2,3], list2 = [‘a’,‘b’,‘c’,‘d’],将list1中的元素作为key,list2中的元素作为value生成一个字典{0:‘a’,1:‘b’…}

list1 = [0,1,2,3]
list2 = ['a','b','c','d']
print(list1)
print(list2)
print("=====通过映射方法======")
dict1 = dict(zip(list1,list2))
print(dict1)
print("=====通过遍历赋值的方式====")
dict2 = {}
for i in range(len(list2)):
    key = list1[i]
    value = list2[i]
    dict2[key] = value
print(dict2)
6.2 练习2

已知任意一个字典,编写代码,交换key和value

举例{0: ‘a’, 1: ‘b’, 2: ‘c’, 3: ‘d’}-----> {‘a’:0,“b”:1…}

dict1 = {0: 'a', 1: 'b', 2: 'c', 3: 'd'}
dict2 = {}
print(dict1)
print("+++++++++++++++++++++++++")
for key in dict1:
    #根据key来的得到value
    value = dict1.get(key)
    #将键作为value 将值作为key
    dict2[value] = key
print(dict2)
print("+++++++++++++++++++++++++++++++++++++++++==")
dict3 = {}
for key,value in dict1.items():
    dict3[value] = key
print(dict3)
6.3 练习3

对一个数字列表进行奇偶数分离,结果如下

举例:[2,3,4,5,6]------> {“偶数”:[2,4,6],“奇数”:[3,5]}

list1 = [2,3,4,5,6]
print(list1)
ji_list = []
ou_list = []
for ele in list1:
    if ele % 2 == 0:
        ou_list.append(ele)
    else:
        ji_list.append(ele)
print(ou_list)
print(ji_list)
dict1 = {}
dict1["偶数"] = ou_list
dict1["奇数"] = ji_list
print(dict1)
print("++++++++++++++++++++++++++")
for key,value in dict1.items():
    print(key,value)
6.4 练习4

随机生成10个整数,范围为1~100之间,统计每个数出现的次数

# 方法1
# 键是数字本身   值是数字出现的次数
nums = [1,22,22,22,1,3,1,3,3,22]
print(nums)
dict1 = {}#键是数字本身   值是数字出现的次数
#  1 1  1 2
#先遍历这个list
for ele in nums:
    #ele ---判断这个ele在字典的key中是否出现过
    #一种是存在的 只需要次数加加
    #一种不存在  只需要存出现一次
    if ele in dict1:#后面都是执行上面
        count = dict1.get(ele)#获取之前这个数字的出现次数
        count += 1
        dict1[ele] = count
    else:#第一次出现 走下面
        dict1[ele] = 1
print(dict1)

# 方法2
nums = [1,22,22,22,1,3,1,3,3,22]
print(nums)
dict1 = {}#键是数字本身   值是数字出现的次数
#首先遍历这个列表
for ele in nums:
    if ele in dict1:
        continue
    #要知道这个数字出现了几次
    count = nums.count(ele)
    dict1[ele] = count
print(dict1)

十六、set 集合

1. 元素的增加

add —整体添加 要求是必须是不可变类型

update 打碎添加 要求必须是可迭代类型

#add ---整体添加    要求是必须是不可变类型
set1 = {1,2,3}
print(set1)
set1.add(100)
print(set1)
set1.add("hello")
print(set1)
#set1.add([19,28])#TypeError: unhashable type: 'list'
set1.add((19,28))
print(set1)
#update   打碎添加   要求必须是可迭代类型
set1.update([18,19])
print(set1)
set1.update((88,99))
print(set1)
set1.update("hehe")
print(set1)
2.元素的删除

pop删除集合在内存中存储之后的第一个元素

remove(对象)

set1 = {1,2,3,44,90}
print(set1)
pop1 = set1.pop()
print(pop1)
print(set1)
pop1 = set1.pop()
print(pop1)
print(set1)
##2.remove  remove(对象)
move1 = set1.remove(44)
print(move1)
print(set1)
if 44 in set1:
    set1.remove(44)
set1.discard(44)
#print(set1[2])#TypeError: 'set' object does not support indexing
#unhashable  ----  (1,2,3)  int float str
#list  dict set
#iterable ----  list tuple set dict str
3.集合的遍历
set1 = {1,2,3,4,99}
print(set1)
for ele in set1:
    print(ele,end=",")
print("+++++++++++++++++++++++++++++++++")
for i,ele in enumerate(set1):
    print(i,ele)
4.集合之间的运算

a & b:交集,集合a和集合b中都包含的元素

a | b:并集,集合a或者集合b中包含的元素

a ^ b:不同时包含集合a和集合b中的元素

a - b:差集,集合a中包含而集合b中不包含的元素

set1 = {1,2,3,5}
set2 = {2,5,8,10}
print(set1)
print(set2)
print("====a & b:交集,集合a和集合b中都包含的元素===")
jiaoji = set1 & set2
print(jiaoji)
print("===a | b:并集,集合a或者集合b中包含的元素======")
bing = set1 | set2
print(bing)
print("===a ^  b:不同时包含集合a和集合b中的元素=====")
yihuo = set1 ^ set2
print(yihuo)
print("++++++++++#1.a - b:差集,集合a中包含而集合b中不包含的元素++++")
cha = set1 - set2
print(cha)
5.集合功能

union:作用和|相同,求并集

intersection,作用和&相同,求交集

difference:作用和-相同,求差集

set1 = {1,2,3,5}
set2 = {2,5,8,10}
print(set1)
print(set2)
print("=====#union:作用和|相同,求并集++++++++++=")
bingji = set1.union(set2)
print(bingji)

print("+++++++intersection,作用和&相同,求交集+++++++++++")
jiao = set1.intersection(set2)
print(jiao)
print("+++++#6.difference:作用和-相同,求差集===")
cha = set1.difference(set2)
print(cha)
set1 = {1,2,3,4}
print(len(set1))
set1.clear()
print(set1)
set1 = {22,33,44}
print(set1)
set2 = set1.copy()
print(set2)
print(id(set1))
print(id(set2))
6.练习

需求:去除列表中的重复元素

# 方式1
ist1 = [5,454,56,56,5]
print(list1)
list2 = []
for ele in list1:
    if ele not in list2:
        list2.append(ele)
print(list2)
print("++++++++++++++++++++++")
# 方式2
set1 = set(list1)
print(set1)
list2 = list(set1)
print(list2)
7.list,tuple,dict和set之间的区别【面试题】

相同点:

  • a.四者都是数据结构
  • b.四者都是可迭代对象
  • c.四者都可以存储不同类型的数据
  • d.可以通过系统的list(),tuple(),dict(),set()进行相互转换

不同点:

  • a.表示形式:list:[] tuple:() dict和set;{}
  • a.dict中存储的键值对,list,tuple和set直接存储元素
  • b.dict中的key不能是可变的数据类型【list,dict,set】
  • c.tuple是不可变的,list,dict,set都是可变的数据类型,可以进行增加和删除的操作
  • d.dict查找和插入的速度较快,不会随着key-value的增多而变慢,但是,list的查找速度会随着元素的增多而变慢【原因:每次查找都是从头开始进行遍历的】
  • e.dict相比较list会占用更多的内存空间,而list只相当于存储了dict中的key或者value,并且在内存中数据是紧密排列的,可以节约大量的内存

十七、简单算法

1.求数字列表中的最大值
list1 = [3,32,54,54,5]
print(list1)
print(max(list1))
max1 = list1[0]
for ele in list1:
    if ele > max1:
        max1 =  ele
print(max1)
2.求数字列表中的最大值和位置
list1 = [3,32,54,54,5]
print(list1)
max1 = list1[0]
max_index = 0
for i in range(len(list1)):
    if list1[i] > max1:
        max1 = list1[i]
        max_index = i
print(max1,max_index)
3.交换列表的给定两个位置的值
list1 = [1,22,33,44,90,100]
num1 = 0
num2 = 3
print(list1)
temp = list1[num1]
list1[num1] = list1[num2]
list1[num2] = temp
print(list1)
4.冒泡排序

相邻元素比较 大的放后面,一般是一个循环嵌套来完成
外循环控制比较轮次–内循环控制比较过程

list1 = [23,3,89,20,9]
print(list1)
#外循环控制比较轮次  比较的轮次 比如有len个数字  因为每次淘汰一个,所有需要len-1次循环
for i in range(len(list1)-1):
    #内循环控制的是比较的过程 从左向右逐一比较
    #左边界 0  右边界 因为每一轮都淘汰一个元素 所以每次右边界都会缩小一个  所以使用-i来表示这种缩减
    for j in range(len(list1)-1-i):
        # j--当前元素   与其相邻后面的一个值比较 所以比较对象 j+1
        #j j+1 比 如果前面大 就要换
        if list1[j] > list1[j+1]:
            #换
            temp = list1[j]
            list1[j] = list1[j+1]
            list1[j+1] = temp
    print(list1)
print(list1)
5.选择排序

选定一个位置 将最小值换到这个位置上
外循环控制选定位置 — 内循环控制比较过程

list1 = [23,3,89,20,9]
print(list1)
#外循环控制选定位置
for i in range(len(list1)-1):# 0 1 2 3
    #内循环  选定位置后面的所有值 所以左边界是i+1  右边界到len-1
    for j in range(i+1,len(list1)):
        #j---i后面的所有值
        #比较的就是i 和 j
        #如果选定位置值比后面的值大 就换
        if list1[i] > list1[j]:
            temp = list1[i]
            list1[i] = list1[j]
            list1[j] = temp
print(list1)
5.1 选择排序的优化

尽量减少堆操作 也就是交换的次数 — 可以提高代码的执行效率

list1 = [99,87,69,20,9]
print(list1)
#外循环控制选定的位置
for i in range(len(list1)-1):
    #i表示的就是选定位置
    #定义一个变量 记录最小值的位置
    min_index = i#默认最小值在选定位置 如果在选定位置 就不会换
    #内循环控制比较过程  目的寻找最小值
    for j in range(i+1,len(list1)):
        #j min_index
        if list1[j] < list1[min_index]:
            min_index = j
    #判断需不需要换 如果最小值就在选定位置 就不换
    if min_index != i:
        temp = list1[i]
        list1[i] = list1[min_index]
        list1[min_index] = temp
print(list1)
6.在一个列表中找一个元素所在的位置
list1 = [3,5,45,4,4,100]
print(list1)
key = 450
for i in range(len(list1)):
    if list1[i] == key:
        print(i)
        break
else:
    print("没有这个元素")
7.二分查找

前提 列表有序
找到中间值 与要找的元素比较 通过比较 缩小查找范围 每次可以淘汰掉一半的元素,所以查询效率很高

list1 = [2,9,20,30,48,78,90,120,390,500]
print(list1)
key = 390
print(key)
#首先定义最小和最大位置
min = 0
max = len(list1)-1
#中间值的默认值
mid = 0
while min <= max:#左边界小于右边界才有可能找到
    #每次查找之前 重新计算中间值的位置
    mid = (min + max) // 2
    #print("min--%d max --%d mid---%d" %(min,max,mid))
    #使用中间值与要找的值进行比较 比较结果有三种
    #中间值大于要找的值  这时候说明值在左半边 缩小右边界  max=mid-1
    #中间值小于要找的值  这时候说明值在右半边 放大左边界  min=mid+1
    #等于  说明找到了 结束
    if list1[mid] > key:
        max = mid - 1
    elif list1[mid] < key:
        min = mid + 1
    else:
        print("找到了 %d " % mid)
        break
else:
    print("没有这个元素")

十八、number 数字

1.布尔型和空值

注意:布尔值相当于数字,True代表1,False代表0,布尔值可以和数字之间进行数学运算

作用:用于if语句或者while语句作为条件

空值是一种特殊的数据类型,当一个变量不确定该指向哪个实体的时候,则可以给它赋值为None,一般用于变量的初始值或者用于重置变量

print(True + 2)
print(False + 2)
num1 = num2 = num3 = 9#=右结合的  +=
print(num1)
print(num2)
print(num3)
print("+++++++++++++++++++++")
num1,num2 = 2,30
print(num1)
print(num2)
2.【面试题:交换两个变量的值,但是不允许出现第三方变量】
a = 10
b = 8
print(a,b)
print("++++++++++++++++#方式一:定义一个中间变量+++++++++++++++++++++")
temp = a
a = b
b = temp
print(a,b)
print("++++++++++++++++#方式一:Python特有的语法+++++++++++++++++++++")
a = 10
b = 8
print(a,b)
a,b=b,a
print(a,b)
print("++++++++++++++++#方式一:加减法+++++++++++++++++++++")
a = 10
b = 8
print(a,b)
a = a + b#  b没变   a便成了两个数之和 a+b   a = 10 + 8 =18  b = 8
b = a - b#  a没变  a+b   b变了 b变成了a     a=18   b=8  a-b = 10  b=a
a = a - b#  a变了 变成了  b还是a            a=18   b=10 a-b = 8  a=b
print(a,b)
print("======#方式四:异或结论:一个数异或另一个数两次,结果为该数本身====")
a = 10
b = 8
print(a,b)
a = a ^ b  # b 没变  a--a异或b的结果 a=2
b = a ^ b  # a 不变  a = 2  b变了  2 ^ 8 --- 10  b变成a ^ b ^ b a
a = a ^ b  # b 没变  是a  a 2--a^b b^a   b^a^a  b  所以是将b赋值给了a
# 0000 1010 --- 10
# 0000 1000 --- 8
# 0000 0010 --- 2
# 0000 1000 --- 8
# 0000 1010 --- 10
print(a,b)
3.math模块的常用方法

1.abs(),求绝对值

2.max/min():求最值

3.pow(),求幂

4.round():求浮点数四舍五入值,

  • 如果省略n,则表示对一个浮点数进行取整,但是会进行四舍五入
  • 如果不省略n,则表示保留小数点后n位,但是会进行四舍五入

5.sum(容器),将容器中的元素进行求和

6.ceil(),向上取整

7.floor(),向下取整

8.sqrt() :求算术平方根,结果为浮点型

9.modf() 分离整数部分和小数部分

10.log(),返回自然对数

#import 导入
import math
print("========#1.abs(),求绝对值==========")
print(abs(9))
print(abs(-9))
print("+++++#2.max/min():求最值=======")
print(max([10,9,29]))
print(min([10,9,2]))
print("+++++=#3.pow(),求幂+++++++")
print(pow(2,3))
print(2 ** 3)
print("++++++++++++++求浮点数四舍五入值+++++++++++++")
"""
round():求浮点数四舍五入值       *****
#round(m,n),如果省略n,则表示对一个浮点数进行取整,但是会进行四舍五入
#如果不省略n,则表示保留小数点后n位,但是会进行四舍五入
"""
print(round(9.99))
print(round(9.93,1))
print(round(4.55,1))
print(round(-4.6))
print("+++++#5.sum(容器),将容器中的元素进行求和+++++++")
print(sum([90,10,80]))
print(sum([1,2,3],3))
print("++++++++进一法====ceil(),向上取整 ====")
print(math.ceil(9.001))
print("++++++++舍一法+++++++++++floor(),向下取整+++++++++++++")
print(math.floor(9.999))
print("++++sqrt() :求算术平方根,结果为浮点型++++")
print(math.sqrt(9))
print(math.sqrt(8))
print("++++modf()   分离整数部分和小数部分===")
print(math.modf(19.29))
print("++++log(),返回自然对数====")
print(math.log(100))
print(math.e)
print(math.pi)
print(math.log10(100))
4.random 随机数
import random
print("++++++++=#1.choice    在一个列表中随机选一个       *****=====")
list1 = [1,20,900,80,30]
for i in range(5):
    print(random.choice(list1),end=",")
print("====range(start,end,step),整数,包头不包尾=====")
for i in range(10):
    print(random.choice(range(1,101)),end=",")
print("====随机的奇数====")
for i in range(10):
    print(random.choice(range(1,101,2)),end=",")
print("====取随机字符===")
for i in range(10):
    print(random.choice("killer"),end=",")
print("===取随机整数=====")
for i in range(10):
    print(random.randint(10,20),end=",")
print("====取随机整数====")
for i in range(10):
    print(random.randrange(1,101,2),end=",")

for i in range(10):
    print(random.random(),end=",")#random是一个0-1之间的一个随机值
##需求:获取20`100之间的任意随机数
print()
for i in range(10):
    print(int(random.random() * 80 +20),end=",")
5.shuffle:对列表中的元素进行随机排序
import random
list1 = ["东","西","南","北","中","发","白板","幺鸡","一万","一筒","九条","九万","九筒"]
lista = []
listb = []
listc = []
listd = []
for i in range(10):
    random.shuffle(list1)
    print(list1)
    lista = list1[0:3]
    listb = list1[3:6]
    listc = list1[6:9]
    listd = list1[9:12]
    print(lista)
    print(listb)
    print(listc)
    print(listd)

十九、str 字符串

\n:换行 \t:制表符

r"xxx";当一个字符串中出现了多个需要转义的字符,则通过r""进行声明,一般应用在路径或者正则表达式

  • print(r"C:\Users\Administrator\Desktop\XA-Python1905\Day7\视频")
1.字符串的创建
str1 = "uu"
print(str1)
print(id(str1))
str2 = "uu"
print(id(str2))
str3 = 'uu is comming ' \
    'killer is running'
print(str3)
str4 = """
uu 
kk
ok
"""
print(str4)
str5 = "aa\nbb\ncc"
print(str5)
str7 = "aa\tbb\tcc"
print(str7)
str = "A"
2.字符串之间的运算

但凡涉及到对字符串中的字符的改变,都是生成了一个新的字符串【字符串是不可变的】

print("======#1.+:拼接===")
str1 = "like "
str2 = "uu"
print(str1+str2)
str3 = "%s---%s" %("go ","home")
print(str3)
print("==========join====")
#用连接符连接字符串
jieguo = " like ".join(["u","her"])
print(jieguo)
print("===使用索引来获取字符串的字符====")
str1 = "today"
print(str1[3])
print("===判断一个字符串中是否含有某个子串===")
str1 = " good good study "
zichuan = "good1"
print(zichuan in str1)
print("========使用切片来获取字符串的一部分=======")
str1 = "张飞去找关羽关羽不在"
print(str1)
print(str1[2:6])
print(str1[6:])
print(str1[-1:-5:-1])
3.字符串的遍历
str1 = "曹操病了华佗来了"
print(str1)
for ele in str1:
    print(ele,end=",")
print("+++++++++++++++++++")
#下标遍历
for i in range(len(str1)):
    print(str1[i],end=",")
print("++++++++++++++++++++++++")
for i,s in enumerate(str1):
    print(i,s)
4.查找

find():从左往右进行检索,返回被查找的子字符串在原字符串中第一次出现的下标,如果查找不到则返回-1

rfind():从右往左进行检索,如果查找不到则返回-1
index():从左往右进行检索,返回被查找的子字符串在原字符串中第一次出现的下标,如果查找不到则会报错
rindex():从右往左进行检索,如果查找不到则会报错

str1 = "关羽托梦给曹操,曹操感觉很不好"
print(str1)
zichuan = "曹操"
print(str1.find(zichuan))
print(str1.find(zichuan,6))
print(str1.find(zichuan,6,10))
print("++++++++++++rfind 从右向左找  下标还是真的下标+++++++++++++++++")
print(str1.rfind(zichuan))
print(str1.rfind(zichuan,7))
print(str1.rfind(zichuan,1,7))
print(str1.find("张飞"))
print("+++++++++++++++++++++")
print(str1.index(zichuan))
print(str1.index(zichuan,6))
#print(str1.index(zichuan,10))
5.转换

int():将字符串转换为整型

eval():将str转换为有效的表达式
upper():小写----》大写,如:Hello----->HELLO
lower():大写----》小写
swapcase():小写----》大写,大写----》小写,如:Hello----->hELLO
title():每个单词的首字母大写,其他全部小写
capitalize():首单词的首字母大写,其他全部小写
chr()
ord()

print("======字符串的转换方法=====")
str1 = "99"
print(int(str1))
str1 = "2*3+2**3"
print(eval(str1))
print("++++++++++++++++++++++++++++")
str1 = "Heloo Uu"
print(str1)
print(str1.upper())#转成全大写
print(str1.lower())#转成小写
print(str1.swapcase())
str1 ="today is a good day"
print(str1)
print(str1.title())
print(str1.capitalize())
print("++++++++++++++++++++++++")
print(chr(97))
print(ord("A"))
str1 ="today is a good day"
print("+++++++++++++++++++++++++++++++++++++++=")
list1 = list(str1)
print(list1)
list2 = []
for ele in list1:
    mazhi = ord(ele)
    list2.append(mazhi)
print(list2)
chazhi = ord("a")-ord("A")
print(chazhi)
for i in range(len(list2)):
    zhi = list2[i]
    zhi = zhi - 32
    list2[i] = zhi
print(list2)
for i in range(len(list2)):
    zhi = list2[i]
    zifu = chr(zhi)
    list2[i] = zifu
print(list2)
str2 = ""
for ele in list2:
    str2 += ele
print(str2)
6.填充和提取
"""
填充和提取
center(width[,fillchar]):用fillchar填充指定的字符串,填充之后字符串的长度为width,原字符串居中显示,
如:hello---->center(15,"*")------》*****hello****       ***
ljust(width[,fillchar]):用fillchar填充指定的字符串,填充之后字符串的长度为width,原字符串居左显示,
如:hello---->ljust(15,"*")------》hello*********
rjust(width[,fillchar]):用fillchar填充指定的字符串,填充之后字符串的长度为width,原字符串居右显示,
如:hello---->rjust(15,"*")------》*********hello
zfill(width):原字符串居右显示,剩余的字符默认为0填充,如:hello---->zfill(15)------》000000000hello
"""
str1 = "hello"
str2 = str1.center(100,"*")
print(str2)
str3 = str1.ljust(100,"*")
print(str3)
str4 = str1.rjust(100,"*")
print(str4)
print(str1.zfill(100))
print("")
"""
strip():去除一个字符串两端的指定字符,如:*****he****llo****----》strip("*")----->he****llo            ***
lstrip():去除一个字符串左边的指定字符
rstrip():去除一个字符串右边的指定字符
"""
print(str2)
print(str2.strip("*"))
print(str2.lstrip("*"))
print(str2.rstrip("*"))
7.替换
"""
##### 替换
> replace(old,new):将原字符串中的old替换为new             ***
> 映射替换
> maketrans():创建一个映射表
> translate():根据映射表将指定字符串中的自定字符替换为映射表中对应的字符
"""
str1 = "关羽喜欢张飞"
print(str1)
print(str1.replace("喜欢","讨厌"))
print("+++++++++++++++++++++++++++++++++++++++++++=")
str1 = "uu is comming"
print(str1)
make1 = str1.maketrans({"u":"w","c":"g"})#第一个方法给一个映射表
str2 = str1.translate(make1)#根据映射表开替换字符串内容
print(str2)
8.分割和合并
"""
##### 分割和合并      ***
> join():合并,使用指定的子字符串将列表中的元素连接【列表-----》字符串】str()
> split():分割,使用指定的子字符串将原字符串进行分割,得到一个列表【字符串----》列表】list()
"""
str1 = "曹操"
str2 = "关羽"
print("怕".join([str1,str2]))
str1 = "刘备+++关羽+++张飞"
names = str1.split("+++")
print(names)
for ele in names:
    print(ele,end=",")
9.判断
"""
##### 判断
> isalpha():一个字符串非空并字符全部是字母才返回True
> isalnum:一个字符串非空并字符全部是字母或者数字才返回True
> isupper/islower/istitle:和upper,lower和title有关
> isdigit()/isdecimal():一个字符串非空并字符全部是数字才返回True          ***
> startswith():判断字符串的前缀【判断一个字符串是否是以指定子字符串开头的】      ***
> endswith():判断字符串的后缀【判断一个字符串是否是以指定子字符串结尾的】     ***
"""
str1 = "sks1ksk"
print(str1)
print(str1.isalpha())#判断全字母
print(str1.isalnum())#判断字母加数字
print("UK".isupper())
print("ss".islower())
print("Killer Uk".istitle())#判断title
print("12a2".isdigit())#判断全数字
print("123".isdecimal())#判断全数字
print("java is uu".startswith("java"))
print("python is kk".endswith("kk"))
print("+++++++++++++++++++++++++++++++++++++++++++++++")
file_lists=["qq.png","kk.java","qquu.py","qqkiller.py"]
for ele in file_lists:
    if ele.startswith("qq"):
        print(ele)
print("+++++++++++++++++++++++++++++++++")
for ele in file_lists:
    if ele.endswith("py"):
        print(ele)

10.编解码
"""
##### 编解码
> encode():编码,将字符串转化为字节类型的过程【str--->bytes】       ***
> decode():解码。将字节类型转换为字符串的过程【bytes---->str】    ***
"""
str1 = "killer"
print(str1)
byte1 = str1.encode()
print(byte1)
print("++++++++++++++++++++++++")
str2 = byte1.decode()
print(str2)
print("+++++++++++++++++++++++++++")
byte2 = str1.encode(encoding="utf8")
print(byte2)
str3 = byte2.decode(encoding="utf8")
print(str3)
11.练习
11.1 练习1
"""
1.写代码,有如下变量,请按照要求实现每个功能
name = "gouguoQ "

a.移除name变量对应值的两边的空格,并输出移除后的内容
b.判断name变量对应的值是否以"go"开头,并输出结果
c.判断name变量对应的值是否以"Q"结尾,并输出结果
d.将name变量对应的值中的"o",替换为"p",并输出结果
e.将name变量对应的值根据"o"分割,并输出结果
g.将name变量对应的值变大写,并输出结果
h.将name变量对-应的值变成小写,并输出结果
i.请输出name变量对应的值的第二个字符
j.请输出name变量对应的值的前三个字符
k.请输出name变量对应值的后2个字符
l.请输出name变量中的值"Q的索引的位置
m.获取子序列,仅不包含最后一个字符,如:woaini则获取woain  root则获取roo
n.利用下划线将列表li = ['gou', 'guo', 'qi']的每一个元素拼接成字符串gou_guo_qi
"""
name = "gouguoQ "
print(name)
print(name.rstrip(" "))
print(name.startswith("go"))
print(name.endswith("Q"))
print(name.replace("o","p"))
print(name.split("o"))
print(name.upper())
print(name.lower())
print(name[1])
print(name[:3])
print(name[len(name)-2:len(name)])
print(name.find("Q"))
print(name[:len(name)-1])
li = ['gou', 'guo', 'qi']
print("_".join(li))
11.2 练习2
"""
#3.实现一个整数加法计算器,例如:从控制台输入 3 + 4,最后输出7
#方式一:int(),split()
"""
print("====使用eval====")
str1 = input("请输入您的加法算式:")
jieguo = eval(str1)
print(jieguo)
print("++++++++++++++++++++++++++++++++")
str1 = input("请输入您的加法算式:")
num_list = str1.split("+")
num1 = int(num_list[0])
num2 = int(num_list[1])
jieguo2 = num2+num1
print(jieguo2)
11.3 练习3
"""
#4.统计用户输入的内容中有几个数字,几个字母?
#isdigit;数字    isalpha:字母
"""
str1 = input("请输入一个字符串:")
#遍历输入的字符串  判断每个字符是数字还是字母
count_num = 0
count_zimu = 0
for ele in str1:
    if ele.isdigit():
        count_num += 1
    elif ele.isalpha():
        count_zimu += 1
    else:
        pass
print("几个数字?%d 几个字母 %d" % (count_num,count_zimu))

11.4 练习4
"""
#5.编写敏感词语过滤程序,提示用户输入内容,如果用户输入的内容中包含特殊的字符,如山寨,水货,则将内容替换为*****
#replace   find/index和in
"""
str1 = input("请输入您的评价:")
print(str1)
str2 = str1.replace("山寨","精品")
str3 = str2.replace("水货","正品")
print(str3)
11.5 练习5
"""
#6.制作表格
#循环提示用户输入:用户名、密码、邮箱(要求用户输入的长度不能超过20个字符,如果超过则只有前20个字符有效),
# 如果用户输入q或者Q表示不再继续输入,将用户的内容一表格形式打印
#方式一:%
"""
while True:
    uname = input("请输入用户名:")
    upw = input("请输入密码:")
    uemail = input("请输入邮箱:")
    list1 = ["q","Q"]
    if uname in list1 or upw in list1 or uemail in list1:
        print("=====game over===")
        break
    str1 = "用户名:%s\t 密码:%s \t 邮箱:%s\n" % (uname,upw,uemail)
    print(str1)
11.6 练习6
"""
format 格式化
"""
str1 = "{}--{}--{}".format("qq","ww","cc")
print(str1)
11.7 练习7
"""
#7.从控制台输入一个表示时分秒时间的字符串,格式为:xx:xx:xx,获取该时间的下一秒
"""
time = input("请输入时间:格式是 xx:xx:xx")
#16:21:30
#11:59:59
#10:59:59
#10:20:59
#10:10:10
#先分隔出数字
time_list = time.split(":")
hour = int(time_list[0])
min = int(time_list[1])
sec = int(time_list[2])
if hour == 11 and min == 59 and sec == 59:
    print("00:00:00")
elif min == 59 and sec == 59:
    print(str(hour+1)+":00:00")
elif sec == 59:
    print(str(hour)+":"+str(min+1)+":"+"00")
else:
    print(str(hour)+":"+str(min)+":"+str(sec+1))

11.8 练习8
"""
#8.从控制台输入一句英文,获取在一个单词出现的次数
"""
str1 = input("请输入一段英文:")
name = "today"
dancis = str1.split(" ")
count = 0
for ele in dancis:
    if ele == name:
        count += 1
print("%s 出现的次数 %d" %(name,count))

二十、函数

1.函数的基本定义

def : 是定义函数的一个关键字
参数
返回值
函数体是使用缩进控制
return 1结束方法 2 返回结果

#没有返回值也没有参数的方法
def fun01():
    print("Hello world")
fun01()
fun01()
#有参数 没有返回值
#打印n边的正方形
#有没有参数   有  有几个  有没有返回值  返回什么
def dayin_zfx(n):
    for i in range(n):
        for j in range(n):
            print("*",end="")
        print()
print("++++++++++++++++++++++++++++++++++++")
dayin_zfx(5)
print("+++++++++++++++++++++++++=")
dayin_zfx(1)
#有参数也有返回值的
# 写一个方法 求两个数之和
def sumAb(a,b):
    #求两个数之和并返回  返回使用return来返回
    return a + b
print("+++++++++++++++++++++++++++++++++++=")
jieguo1 = sumAb(10,3)
print(jieguo1)
jieguo2 = sumAb(90,800)
print(jieguo2)
2.使用
2.1 写方法
#1 求1--n之间的和
# 参数  n
# 返回值  sum
def one_to_nsum(n):
    sum = 0
    for i in range(1,n+1):
        sum += i
    return sum
print("+++++++++++++")
jieguo1 = one_to_nsum(5)
jieguo3 = one_to_nsum(100)
print(jieguo1,jieguo3)
#求两个数的较大者
# 有两个参数 a b
# 返回较大的
def get_bigger(a,b):
    if a > b:
        return a
    return b
print("+++++++++++++")
print(get_bigger(10,8))
print(get_bigger(7,90))
print(get_bigger(2,2))
#求三个数的较大者
#参数   a b c
#返回最大的
def get_bigger3(a,b,c):
    if a > b:
        if a > c:
            return a
    else:
        if b > c:
            return b
    return c#如果最大的不是a 也不是b 那一定是c
print("++++++++++++++++++++++++++++")
print(get_bigger3(10,3,9))
print(get_bigger3(1,90,3))
print(get_bigger3(1,3,90))
#求1--n之间偶数的数量
#参数  n
#返回值 数量
def get_ou_count(n):
    count = 0
    for i in range(1,n+1):
        if i % 2 == 0:
            count += 1
    return count
print("++++++++++++++++++++++++++++")
print(get_ou_count(10))
2.2 函数的调用
"""
#函数的调用:函数入栈【栈的特点:先进后出,后进先出】
"""
def fun1():
    print("=====fun1==begin==")
    fun2()
    print("=====fun1==end==")
def fun2():
    print("=====fun2==begin==")
    fun3()
    print("=====fun2==end==")
def fun3():
    print("=====fun3==begin==")
    fun4()
    print("=====fun3==end==")
def fun4():
    print("=====fun4==begin==")
    print("=====fun4==end==")
fun1()
2.3 封装函数,判断某年的平润性
#写一个方法 判断年是不是闰年
def is_run_nian(year):
    if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
        return True
    return False
for i in range(2000,2021):
    print(i,is_run_nian(i))
##3.封装函数,求1~某个数范围内整数的和
def qiu_he(n):
    sum = 0
    for i in range(n+1):
        sum += i
    return sum
print(qiu_he(10))
2.4 练习
"""
方法调用方法
因为方法的功能要单一
功能不混合  有利于调用控制
fun1
fun2
fun3

1 2 3  1 3 2 231  213

"""
#写一个方法 判断一个数是不是质数
#有没有参数  有  一个数 n
def is_zhishu(n):
    for i in range(2,n):
        if n % i == 0:
            return False
    #出了循环 还没有return 就说明是质数
    return True
#写一个方法 求2--n之间所有的质数的数量
#参数  n
#返回值 质数的数量
def get_zhishu_count(n):
    count = 0
    for i in range(2,n+1):
        #判断i是不是质数
        if is_zhishu(i):
            count += 1
    return count
print(get_zhishu_count(100))
#打印2---n之间的质数
def dayin_zhishu(n):
    for i in range(2,n+1):
        if is_zhishu(i):
            print(i,end=",")
dayin_zhishu(100)
3.参数
3.1
"""
a.必需参数:必须以正确的顺序和正确的类型进行传参,否则会出现错误
"""
def canshu_fun(a,b):
    print("姓名 %s 年龄 %d" % (a,b))
canshu_fun("qq",20)
#canshu_fun(20,"qq")#传参的时候要按照形参的顺序传递实参
#canshu_fun("ss")#TypeError: canshu_fun() missing 1 required positional argument: 'b'
#canshu_fun("qq",20,30)#TypeError: canshu_fun() takes 2 positional arguments but 3 were given
3.2
"""
.默认参数:在函数声明的时候给形参设置一个初始值,如果传参的时候不传递实参,则使用默认值,如果传递了参数,则默认值会被覆盖
#c.注意1:默认参数出现在形参列表中,只能出现在整个列表的最后
"""
def canshu_fun(num=0):
    print(num)
canshu_fun()#默认值参数如果没有实参 取自己的值
canshu_fun(10)#传了实参 就取实参的值
def canshu_fun2(name,pw,age=10):
    print("用户名 %s" % name)
    print("密码 %s" % pw)
    print("年龄 %s" % age)
print("+++++++++++++++++++++++++++")
canshu_fun2("ww","123")
canshu_fun2("qq","222",30)


3.3
"""
c.关键字参数:传参的时候实参的顺序和形参的顺序可以不一致,因为Python解释器能够使用关键字匹配传参
#注意1:使用关键字参数进行传参,可以不用保持参数的顺序一致,,关键字的名称使用的形参的变量名
#注意2:在实参列表中,如果有部分参数设置成了关键字参数,则关键字参数必须出现在实参列表的最后
"""
def guan_jianzi_fun1(name,pw,age):
    print("姓名 %s" % (name))
    print("密码 %s" % (pw))
    print("年龄 %d" % (age))
print("++++++++++++++关键字参数体现在方法被调用的时候 也就是实参中+++++++++++++++++++")
guan_jianzi_fun1("qq","999",20)
print("++++++++++++++++++")
guan_jianzi_fun1(age=30,name="张飞",pw="888")
print("+++++++++")
guan_jianzi_fun1("关羽","123",age=28)
print("+++++++++++++++")
#guan_jianzi_fun1(30,name="曹操",pw="000")#TypeError: guan_jianzi_fun1() got multiple values for argument 'name'
#不用关键字参数 就得按顺序  后面的可以用

3.4
"""
d.不定长参数【可变参数】:函数在实现的时候可以处理比声明时候更多的数据
"""
def sum1(a,b):
    return a + b
def sum2(a,b,c):
    return a + b + c
"""
#不定长参数【可变参数】
#1.*
#a。
#注意1:*xxxx,则被当做元组处理,xxx就是一个元组的名称
"""
#求n个数之和
def sum_n(*nums):
    #print(num)
    sum = 0
    for ele in nums:
        sum += ele
    return sum
sum11 = sum_n(1,2,3)#(1, 2, 3)
print(sum11)
sum22 = sum_n(1,2,3,4,5)#(1, 2, 3,4,5)
print(sum22)
print("++++++++++++++++++++++#注意3:在形参列表中,不定长参数使用在列表的最后+++++++++++++++++++++++++++++++++")
#求两个固定数与不定多个数之和
def kebian(a,b,*nums):
    sum = 0
    sum += a
    sum += b
    for ele in nums:
        sum += ele
    return sum
print(kebian(1,99,1,2,3,4,5))
def kebian2(*nums,a,b):
    return a + b
#kebian2(1,2,3,4)#TypeError: kebian2() missing 2 required keyword-only arguments: 'a' and 'b'
jieguo = kebian2(1,2,3,a=10,b=9)
print(jieguo)

3.5
"""
#【面试题】
#注意:不管是列表还是元组,最终*xxx得到的结果都是一个列表,不同的变量进行数值的分配
"""
a,b=3,4
print(a,b)
a,b,*c= (1,2,3,4,5)
print(a,b,c)
a,*b,c = (1,2,3,4,5)
print(a,b,c)
*a,b,c = (1,2,3,4,5)
print(a,b,c)
def fun1(*a,b,c):
    print(a,b,c)
fun1(1,2,3,b=9,c=10)

3.6
"""
#注意1:**xxx,xxx会被当做字典进行处理,传参的时候实参必需以key=value的方式进行传参
"""
def fun1(**num):
    #形参被认为是一个字典
    print(num)
    for key,value in num.items():
        print(key,value)
fun1(a=10,b=9)#关键字就会作为字典的键 值就会作字典的值
#姓名 qq  年龄 20  pw  999
fun1(name="qq",pw="999",age=20)
fun1(age=80,sex="man",email="ww@qq.com")
3.7 练习
#1.封装函数,对一个列表使用冒泡进行排序【模拟sort的使用:默认升序排序,指明条件的时候降序排序】
def mysort(newlist,reverse=False):   #默认值参数
    #冒泡排序
    if reverse:#如果是真 就降序 否则升序
        for i in range(len(newlist)-1):
            for j in range(len(newlist)-1-i):
                if newlist[j] < newlist[j+1]:
                    newlist[j], newlist[j + 1] = newlist[j + 1], newlist[j]
    else:#升序
        for i in range(len(newlist)-1):
            for j in range(len(newlist)-1-i):
                if newlist[j] > newlist[j+1]:
                    newlist[j],newlist[j+1] = newlist[j+1],newlist[j]
list1 = [1,23,8,90,100,93,4]
print(list1)
mysort(list1)
print(list1)
mysort(list1,reverse=True)
print(list1)
4.值传递和引用传递
"""
##### 值传递和引用传递【面试题】

> 值传递:传递的是不可变的数据类型,如:number,str,tuple,bool
>
> 引用传递:传递的是可变的数据类型,如:list,dict,set
结论:
值传递:传递的是不可变的数据类型,如果形参发生改变,对实参没有影响
引用传递:传递的是可变的数据类型,如果形参发生改变,实参也会随着改变

值传递  ---  就是将值传进去
引用传递  --- 传递的是地址 改变原始值
"""
#值传递的例子
def fun1(num):
    num += 1
    print(num)
num1 = 9
fun1(num1)
print(num1)
def fun2(name):
    name = "hello"
    print(name)
name1 = "uu"
fun2(name1)
print(name1)
print("++++++++++++++++++++++++++++++")
#引用传递的例子
def fun3(list1:list):
    list1.reverse()
    print(list1)
list2 = [2,34,1]
print(list2)
fun3(list2)
print(list2)
#字典
def fun4(dict1:dict):
    dict1["aa"] = 99
dict2 = {"aa":100,"cc":80,"vv":8}
print(dict2)
fun4(dict2)
print(dict2)
5.返回值
5.1
"""
返回值
"""
def fun1():
    pass
jieguo = fun1()
print(jieguo)
def fun2():
    return 10
jieguo2 = fun2()
print(jieguo2)
print("+++++++++++++++++++++++++++++")
def fun3(num):
    if num == -1:
        return
    print(num)
    return  num + 1
jieguo4 = fun3(9)
print(jieguo4)
jieguo3 = fun3(-1)
print(jieguo3)
"""
#4.return存在的意义:在函数内部运算的结果,如果想要在函数外部进行访问,直接访问不到【变量是有作用域的】,
# 则可以通过返回值的形式返回给调用者
"""
print("+++++++++++++++++++++++++++++++")
def fun4(num):
    num = num + 90
    print(num,end="+++++++")
    return num
num1 = 9
num2 = fun4(num1)#值传递的时候 num的作用域在方法内 只能通过返回值的方式记录其变化
print(num1)
print(num2)
5.2
""""
#5.特殊情况一:return后面可以跟多个数据,.在函数外面调用获取的结果为一个元组
"""
def fun1(num,num2,num3):
    num += 1
    num2 += 2
    num3 += 3
    return num,num2,num3
a = 10
b = 10
c = 10
print(a,b,c)
jieguo1 = fun1(a,b,c)
print(jieguo1)#(11, 12, 13)
a = jieguo1[0]
b = jieguo1[1]
c = jieguo1[2]
print(a,b,c)


5.3
"""
#6.特殊情况二:函数中的多分支中也可以使用return,不同的分支可以有不同类型的返回值,
# 不同的分支可以根据具体的情况决定是否需要设置返回值【原理:Python是一种弱类型的语言】
"""
def fun1(sex):
    if sex == "man":
        return "good boy"
    else:
        return "good girl"
jieguo1 = fun1("man")
print(jieguo1)
jieguo2 = fun1("uu")
print(jieguo2)

5.4
"""
#7.特殊情况三:break和return之间的区别
#break仅仅使用在循环中,结束当前的循环,
#return使用在函数中,结束当前函数,不管return存在于多少层嵌套循环中,一旦遇到return,整个函数都会结束

#在某些情境下,可以使用return代替break
"""
#判断循环是否包含第二个数字
def fun01(n,m):
    for i in range(n):
        if i == m:
            return 100
    return -1
jieguo1 = fun01(10,8)
print(jieguo1)
jieguo2 = fun01(10,90)
print(jieguo2)
6.递归
6.1
"""

7: 使用递归来实现斐波那契数列的前N项的和
		1,1,2,3,5,8,13,21,34.....
	定义两个方法
	一个数列值
	一个求和
f(n) = f(n-1)+f(n-2)
f(2) = 1
f(1) = 1
"""
#写一个方法求第n项的值
def get_fbnq(n):
    #先写出口
    if n == 1 or n == 2:
        return 1
    return get_fbnq(n-1) + get_fbnq(n-2)
for i in range(1,15):
    print(get_fbnq(i),end=",")
#再写一个方法求前n项的和
def get_sum_fbnq(n):
    sum = 0
    for i in range(1,n+1):
        sum += get_fbnq(i)
    return sum
print()
print("前10项的和%s" % get_sum_fbnq(10))
6.2
"""

7: 使用递归来实现斐波那契数列的前N项的和
		1,1,2,3,5,8,13,21,34.....
	定义两个方法
	一个数列值
	一个求和
f(n) = f(n-1)+f(n-2)
f(2) = 1
f(1) = 1
"""
#写一个方法求第n项的值
def get_fbnq(n):
    #先写出口
    if n == 1 or n == 2:
        return 1
    return get_fbnq(n-1) + get_fbnq(n-2)
for i in range(1,15):
    print(get_fbnq(i),end=",")
#再写一个方法求前n项的和
def get_sum_fbnq(n):
    sum = 0
    for i in range(1,n+1):
        sum += get_fbnq(i)
    return sum
print()
print("前10项的和%s" % get_sum_fbnq(10))

二十一、list 列表生成式和生成器

1 列表生成式
1.1 list(range())
#1.方法1
range1 = range(1,10,2)
list1 = list(range1)
print(list1)
print("++++++++++++++++++++")
#2.方法2
list1 = []
for i in range(2,11,2):
    list1.append(i)
print(list1)

1.2 list中for循环的简写方式
#1.类型1
list1 = [i ** 3 for i in range(1,10)]
print(list1)
list2 = [i ** 3 +1  for i in range(1,6)]
print(list2)
#2.类型2
list3 = [i ** 3 for i in range(1,10) if i % 2 == 0]
print(list3)
#3.类型3(笛卡尔积)
name_list = ["张飞","关羽","刘备"]
age_list = [30,32,39]
list_person = [name + "的年龄:" + str(age) for name in name_list for age in age_list]
print(list_person)
1.3 在列表生成式中,for循环中也可以使用多个变量
dict1 = {"k1":"v1","k2":"v2"}
list1 = [key + "--" + value for key,value in dict1.items()]
print(list1)
1.4 练习
list1 = ["Aaa","vsf","HELLo"]
list2 = [ele.lower() for ele in list1]
print(list2)
1.5 isinstance(变量,类型),判断一个变量是否是指定的数据类型,是则返回true
a = 10
if isinstance(a,int):
    print(True)
else:
    print(False)
x = "hello"
if isinstance(x,str):
    print(True)
else:
    print(False)
print("++++++++++++++++++++++")
list1 = ["qq","uu","ww",10]
for ele in list1:
    if isinstance(ele,str):
        print(ele + "kk")
2 生成器(不重要,过)

可迭代对象和迭代器

1 可迭代对象

只能用for循环遍历的数据被称为可迭代对象【Iterable类】

可迭代对象的数据类型:

​ a.集合数据类型:list,tuple,dict,set,str

​ b.generator:包括()生成器和带yield关键字的函数

from collections.abc import Iterable

list1 = [1,2,3]
tuple1 = (1,2)
dict1 = {"k1":"v1","k1":"v2"}
set1 = {1,2}
print(isinstance(list1,Iterable))
print(isinstance(tuple1,Iterable))
print(isinstance(dict1,Iterable))
print(isinstance(set1,Iterable))
print("ss",Iterable)
2 迭代器(过)

函数的本质

1.变量可以指向函数

函数本身就代表它自己

函数名就是函数对象

可以使用别的变量来接收这个对象

print(abs(-10))
print(abs)#<built-in function abs>
def fun1():
    pass 
print(fun1)#<function fun1 at 0x000002C68C7FC1E0>
x = -10
a = abs
print(a(x))
2.函数名是一个变量名

不能使用系统函数当做变量名

abs = 9 #将系统的abs覆盖掉了
print(abs(-9))#报错 TypeError: 'int' object is not callable
max = 10
list1 = [10,2,3]
max1 = max(list1)#报错 TypeError: 'int' object is not callable
3.函数可以作为参数
#1.练习1
def fun1(n):
    return n**2 + 1
def fun2(x,y):
    fun1(x) + fun2(y)
def fun3(x,y,f1):
    return f1(x) + f1(y)
jieguo1 = fun3(3,4,fun1)
#2.练习2
def fun21(n):
    return n**2
def fun22(n):
    return n**3
def fun23(x,y,f1,f2):
    return f1(x)+f1(y)+f2(x)+f2(y)
jieguo1 = fun23(1,2,fun21,fun22)
print(jieguo1)

二十二、闭包【了解】

如果在一个函数的内部定义了另外一个函数,外部的函数被称为外部函数【outter】,里面的函数被称为内部很熟【inner】

在一个外部函数中定义一个内部函数,并且外部函数的返回值为内部函数的引用,这样就构成了闭包【Closure】

1 简单的闭包【没有参数】
def outter1():
    #在方法里面定义了另外一个方法 将这个方法的引用作为外部的方法的返回值
    def inner1():
        print("====闭包函数被调用了====")
        return 10
    return inner1 #方法名就是方法本身 -- 方法名就是方法这个对象的一个引用
fun1 = outter1()#通过调用外部方法得到闭包方法的对象
fun1()
2 闭包有参数,外部函数没有参数
def outter2():
    def inner2(a):
        print("====闭包被调用了====")
        return a ** 3
    return inner2
fun2 = outter2()
jieguo = fun2(3)
print(jieguo)
3 闭包有参数,外部函数也有参数,尽量不要使用同名参数
def outter3(x):
    def inner3(y):
        return x ** 2 + y ** 2
    return inner3
fun3 = outter3(3)
jieguo3 = fun3(2)
print(jieguo3)

二十三、变量的作用域【了解】

1.概念

出现的原因:变量的作用域指的是变量可以被访问的范围

程序中的变量并不是在任意的位置都可以访问,访问权限取决于该变量被定义的位置

变量的生命周期也决定了变量被访问的范围

分类:

​ L:local,局部作用域

​ E:Enclosing,函数作用域【定义在方法内,只能在方法内使用】

​ G:Global,全局作用域(在.py文件任意一个位置都能使用)

​ B:Built-in,內建作用域【内置作用域】 a = abs

#1.
a = 10
print(a)
def fun1():
    print(a)
fun1()
print("++++++++++++++++++++")
#2.
def fun2():
    num1 = 8 #函数作用域  这个num1的使用范围是这个函数
    print(num1)
print(num1)#函数外部不能访问
for i in [1,2,3]:
    print(i)
print(i)
def fun3():
    for j in [1,2,3]:
        print(j)
print(j)#外部不能访问
2.查找规则
kk = 10
def fun4():
    kk = 7
    print(kk)
fun(4)
if True:
    xx == 7
print(xx)
3.全局变量和局部变量

说明:全局和局部只是一个相对的概念

4 global和nonlocal关键字
4.1 global
a = 20
def test():
    global a #在这个函数中操作的变量是外部的那个全局变量a
    a += 1
test()
print(a)
4.2 nonlocal

nonlocal只能使用在闭包中

二十四、装饰器基本用法

如果增强一个函数的功能但是又不希望原函数被修改,这种代码运行的期间动态增加函数功能的机制被称为装饰器【Decorator】

装饰器的本质:就是一个闭包,只是需要被装饰的函数当做参数传递给闭包,最后返回装饰之后的结果【内部函数的引用】

高阶函数:将一个函数作为另外一个函数的参数,返回一个结果

def fun1():
    print("===功能001===")
    print("---功能002---")
def outter(f):#f -- 将来可以接收fun1的引用 当然在闭包中对传递进来的函数功能进行扩展
    def inner():
        print("----扩展功能001----")
        f()
        print("----扩展功能002----")
    return inner
in1 = outter(fun1)
in1()
print("++++++++装饰完后 原函数功能不变++++++++++")
fun1()
1 实现一个装饰器,可以计算函数的执行时间
def fun1():
    for i in range(100000):
        print(i,end=",")
def fun2():
    for i in range(50000):
        print(i,end=",")
def outter(f):
    def inner():
        start = time.time()
        f()
        end = time.time()
        print("函数执行时间:%s" % (end-start))
    return inner
in1 = outter(fun1)
in1()
print("++++++++++++++++++")
in2 = outter(fun2)
in2()   

二十五、栈和队列

1 栈

特点:先进后出,后进先出

1.1 列表的底层维护了一个栈结构
stack = []
print("+++++++++入栈++++++++++")
def fun1(name):
    stack.append(name)
def fun2():
    stack.pop()
fun1("张飞")
print(stack)
fun1("关羽")
print(stack)
fun1("刘备")
print(stack)
fun2()
print(stack)
fun2()
print(stack)
fun2()
print(stack)
2 队列

先进先出,后进后出

import collections
queue = collections.deque()
def fun3(name):
    queue.append(name)
def fun4():
    queue.popleft()
fun3("张飞")
print(queue)
fun3("刘备")
print(queue)
fun3("曹操")
print(queue)
fun4()
print(queue)
fun4()
print(queue)
fun4()
print(queue)

二十六、目录遍历

1.os模块

os:operation system

1.1 os.listdir(path),获取一个指定路径下所有的内容【包含文件和文件夹】

返回值:返回一个列表,列表中的元素是文件或者文件夹的名称

path = r"C:\Users\Administrator\Desktop\XA-Python1905"

import os
path1 = r"E:\pythonjiaoben"
print(path1)
print(type(path1))
files = os.listdir(path1)
print(files)
1.2 拼接路径

方式一:subPath = path + “\” + “Day2Code”

方式二:os.path.join(父路径,文件或者文件夹的名称):拼接路径

  • 返回值:新的路径
import os
path1 = r"E:\pythonjiaoben"
path2 = path1 + "\\" +"day49"
print(path2)
path3 = os.path.join(path1,"day49")
print(path3)
1.3 判断一个路径是否是文件或者文件夹

isfile(path):判断指定的路径是否是文件,如果为True,则表示是文件

isdir(path):判断指定的路径是否是目录,如果为True,则表示是目录

import os
path2 = r"E:\pythonjiaoben\day49"
path3 = os.path.join(path2,"bibao.py")
print(os.path.isfile(path3))
print(os.path.isdir(path3))
2.递归遍历目录

需求:封装函数,获取一个指定目录下所有的内容,如果是文件,则直接打印,如果是文件夹,则继续查找

2.1 例1:遍历文件夹
import  os
def getAllFile(path):
    #判断这个文件夹是否存在,如果不存在直接停止
    if not os.path.exists(path):
        print("路径不存在,无法操作")
        return
    #判断这个path是不是一个真的文件夹,如果是文件,不需要遍历
    if os.path.isfile(path):
        print("路径是一个文件:%s" % path)
        return
    #说明这个path是一个文件夹 并且存在
    #获取这个目录下的所有文件及文件夹
    file_list = os.listdir(path)
    for file in file_list:
        file_name = os.path.join(path,file)
        if os.path.isdir(file_name):
            getAllFile(file_name)#递归遍历
        else:
            print("路径是一个文件:%s" % file_name)
if __name__ == "__main__":
    path1 = r"E:\pythonjiaoben"
    getAllFile(path1)
2.2 例2 .png 文件
import os
def get_all_png(path):
    if not os.path.exists(path):
        print("该目录不存在")
        return
    if os.path.isfile(path):
        print("这是一个文件:%s" % path)
        return
    file_list = os.listdir(path)
    for file in file_list:
        if os.path.isdir(path):
            file_name = os.path.join(path,file)
            get_all_png(file_name)
        else:
            if file_name.endwith(".png"):
                print("这是一个文件:%s" % file_name)
if __name__ == "__main__":
    path1 = r"E:\day49"
    get_all_png(path1)

二十七、包

包:初期理解为文件夹【目录】

包是一种管理Python模块命名空间的形式,采用“点语法”,避免文件或者文件夹的命名冲突的情况

注意:包和普通文件夹之间的区别:包下必须存在一个文件,名称为:init.py,目前该文件为空,表示当前的文件夹并不是一个普通的文件夹,而是一个包,后期会在该文件中书写一个项目的配置信息

#测试的模块
#首先导入模块
import bao1.moudle1
import bao2.moudle2
print(bao1.moudle1.a1)
bao1.moudle1.fun1()
print("+++++++++++++++++++++++++++++++++++++")
print(bao2.moudle2.a2)
bao2.moudle2.fun2()

二十八、自定义模块

1 import xxxx

优点:不同的模块中出现重名的变量或者函数,相互之间没有任何影响

缺点:import xxx不管什么样的情况下,访问模块中的内容,都需要指明变量或者函数的来源

import  aaa.moudle01
print(aaa.moudle01.str1)
aaa.moudle01.func()
2 form xxx import xxx

格式:from 模块名 import 变量名,函数名或者类名

优点:

  • 访问变量和调用函数代码比较简化,不需要对变量或者函数的来源进行声明
  • 根据具体的需求可以选择性的导入变量或者函数,可以节约内存空间

缺点:

  • 如果不同的模块中出现了重名的变量或者函数,则后导入的变量或者函数会覆盖之前的
  • 如果一个模块中有大量的变量或者函数需要导入,则需要挨个书写,可以使用from … import *简化
  • 如果在当前文件中出现和模块中重名的函数或者变量,则调用的是当前文件

自定义的模块一般建议使用from …import …的方式导入

from bao1.moudle1 import a1,fun1
from bao2.moudle2 import a2,fun2
print(a1)
print(a2)
print(fun1)
print(fun2)

二十九、系统模块

1 时间模块

掌握:时间不同形式之间的转换

时间间隔:是以秒为单位的浮点数

时间戳:从1970.1.1 00:00:00开始到指定时间的秒数

1.1 time

UTC:格林威治天文时间,世界标准时间,在中国UTC+8

时间的表示形式:

​ a.时间戳形式

​ 以整型或者浮点型表示的一个以秒为单位的时间间隔,从1970.1.1 00:00:00开始到指定时间的秒数

​ b.元组形式

​ 时间的元组形式

​ 【year:年,month:月,day:天,hour;时,minutes:分,seconds;秒,weekday:星期,day in year:一年中的第几天,isdst:是否是夏令时,0表示正常格式,1表示夏令时格式,-1表示自定义格式】

​ 注意:

​ month的取值范围:1~12

​ weekday的取值范围:0~6,0表示星期一

​ c.字符串形式

​ 使用格式化的方式表示时间

​ %Y:年份

​ %m:月份

​ %d:日

​ %H;24小时制

​ %M:分

​ %S:秒

time.time()

time.gmtime()

time.localtime():获取当地时间的元组形式

time.mktime

time.ctime

import time
print(time.time())
print("++++++获取UTC的元组形式++++++")
time2 = time.gmtime()
print(time2)
print(time2[0])
print(time2[1])
print(time2[2])
print("++++++++++获取当地时间的元组+++++++++++")
time3 = time.localtime()
print(time3)
#将元组形式转换为时间戳形式
time4 = time.mktime(time3)
print(time4)
#将时间的时间戳形式转换为字符串形式
print(time.ctime(time.time()))
#将时间的元组形式转换为字符串形式:默认格式
print(time.asctime(time3))
#将时间的元组形式转化为字符串形式:自定义格式strftime
time5 = time.strftime("%Y--%m--%d",time3)
print(time5)
#time.sleep
print("====开始睡=====")
time.sleep(10)
print("=====醒了=======")
1.2 datetime模块
import datetime
#1.获取当前时间
d1 = datetime.datetime.now()
print(d1)
##2.获取指定时间[年月日时分秒毫秒]
d2 = datetime.datetime(1996,10,20,10,10,10,100)
print(d2)
##3.字符串和datetime类型之间的转换
d3 = d1.strftime("%Y===%m=====%d")
print(d3)
#4.datetime时间对象之间可以进行加法运算
date1 = datetime.datetime(1996,10,20,10,10,10,100)
date2 = datetime.datetime(2020,11,20,10,10,50,100)
cha = date2 - date1
print(cha)
print(cha.days)
print(cha.seconds)
1.3 calendar 日历

isleap 判断是不是闰年

"""
calendar模块
"""
import calendar
print(calendar.isleap(2000))#判断是否是瑞年
print(type(calendar.month(1998,10)))
print(calendar.month(1998,10))
print(calendar.calendar(2000))
2.os模块
2.1 获取环境变量
import os
print(os.name)
##2.获取当前操作系统中的环境变量
print(os.environ)
print("++++++++++++++++++++++++++++++++++++++++++++++")
print(os.environ.get("JAVA_HOME"))
print("+++++++++++++++++++++")
print(os.environ.get("MYSQL_HOME"))
print(os.environ.get("PATH"))
paths = os.environ.get("PATH")
print(type(paths))
lists = paths.split(";")
for nr in lists:
    print(nr)
print("++++++++++++++++++++++++++++++++++++++++++++")
print(os.curdir)
"""
#二、函数
#二、一:os下的函数
#1.获取当前工作目录 
"""
print(os.getcwd())#D:\PycharmProjects\2202\day49code\xitongmokuai2
2.2 文件相关
"""
创建文件 mkdir
"""
import os
path1 = r"D:\2202\day49\uu"
if not os.path.exists(path1):
    os.mkdir(path1)
print("===文件夹创建成功====")
path2 = r"kk"
if not os.path.exists(path2):
    os.mkdir(path2)
print("====文件夹2创建成功")
zi1 = os.path.join(path1,"killer")
if not os.path.exists(zi1):
    os.mkdir(zi1)
print("====文件夹3创建成功")
print("+++++++++++++++++++")
if os.path.exists(zi1):
    os.rmdir(zi1)
    print("===删除成功====")
print("++++++++++++++++++++++++++++++++++++++")
file = r"D:\2202\day49\uu\qq.txt"
#print(os.stat(file))
#os.stat_result(st_mode=33206, st_ino=3940649674274606, st_dev=170019028, st_nlink=1,
#st_uid=0, st_gid=0, st_size=8, st_atime=1652775705, st_mtime=1652775705, st_ctime=1652775684)
os.rename(file,r"D:\2202\day49\uu\qq2.txt")
#file1 = r"D:\2202\day49\uu\qq2.txt"
#os.remove(file1)
#os system 可以执行系统命令
#os.system("notepad")
#os.system("winmine")
print(os.path.abspath("kk"))#D:\PycharmProjects\2202\day49code\xitongmokuai2\kk
##3.拆分路径
#注意:得到的结果为一个元组(父路径,子路径)
r2 = os.path.split(file)
print(r2)
##6.获取文件大小,返回字节数        *****
print(os.path.getsize(file))
##7.获取文件的目录
print(os.path.basename(file))#文件子路径
print(os.path.dirname(file))#父路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0uIAwBoU-1679826628525)(C:\Users\11700\AppData\Roaming\Typora\typora-user-images\image-20220517165824945.png)]

3 logging 日志

作用:记录程序的运行过程,记录变量 时间执行信息 用以分析程序的错误

"""
python中打日志
记录程序的运行过程  记录变量 时间执行信息  用以分析程序的错误
事件的严重程度:
 debug
 info
 notice
 warning
 errors
 critical
 alter
 emergency
"""
import logging
print("++++++++++++两组方法====")
#设置日期的格式
dateFormat = "%m/%d/%Y %H:%M:%S"
logformat = "%(asctime)s - %(levelname)s - %(message)s"
logging.basicConfig(filename="my.log",level=logging.ERROR,format=logformat,datefmt=dateFormat)
a = 10
b = 3
logging.debug("===========debug=====")
logging.info("===========info=====")
logging.warning("+++++++++++warning+++++++++++++")
logging.error("===========error=====")
logging.critical("===========critical=====")
print("+++++++++++++++++++++++++++++++++++++++++++++++++++")
logging.log(logging.ERROR,"++++++++++++++++++ERROR++++++++++++")
4 sys模块
import sys
print(sys.path)
print("++++++++++++++++++")
print(sys.platform)
5 hashlib 加密模块
"""
hashlib模块
"""
import hashlib
md51 = hashlib.md5()
md51.update("hello 123".encode("utf-8"))
print(md51.hexdigest())#1bb45824de71b2f6476d800f427cb2ab

#1bb45824de71b2f6476d800f427cb2ab
#"hello 123" --->  1bb45824de71b2f6476d800f427cb2ab
md51.update("hello 123 ".encode("utf-8"))
print(md51.hexdigest())

python 面向对象

一、面向过程 和 面向对象的区别

1. 面向过程

1.冰箱装大象 以我为视角

打开冰箱 --> 把大象装进去 --> 关上冰箱门

2.人抢银行

2. 面向对象

面对象是一种思想,比较抽象

1.冰箱装大象

冰箱 --> 具有装大象功能

大象 --> 被装进去

冰箱自己打开冰箱门 --> 大象自己走进去了 --> 冰箱门关上了

2.人抢银行

人 --> 有抢银行的功能

银行 --> 有防抢的功能

3. 区别(面试题):

把人从执行者变成了一个控制者

面向过程:

​ 优点:性能比面向对象高,

​ 缺点:开销比较大,比较耗资源,没有面向对象易于维护,易于扩展,易于复用

面向对象:

​ 优点:易于维护,易于扩展,易于复用,由于面向对象有封装,继承和多态的特定,可以设计出低耦合的应用,使得系统更加灵活

​ 缺点:性能比面向过程低

二、类和对象【重点掌握】

1.概念

类:多个具有特殊功能的个体的集合

对象:在一个类中,一个具有特殊功能的个体,能够帮忙完成某件事情,也被称为实例

2.定义类

语法:

def 函数名():

​ 函数体

class 类名():

​ 类体

说明:

​ a.Python中使用class关键字定义类

​ b.类名:只要是一个合法的标识符即可,但是,类名尽量是大驼峰,尽量做到见名知意

​ c.():目前,()为空,不要省略

​ d.类体:Python中通过缩进来区分类体

​ e.类的定义包含两部分:类的声明和类的实现

​ f.类体包含两部分:对类的特征的描述(属性)和对类的行为的描述(功能)

3.设计类

类体中需要书写哪些内容

要设计一个类,只需要关心3个要素

​ 事物名称:类名,如:人【Person】

​ 事物的特征:变量,如:姓名【name】,年龄【age】

​ 事物的行为:函数,如:跑步,唱歌

注意:初期学习,通过提取动名词描述类

三、类中的方法【函数】和属性【重点掌握】

定义在类中的内容被称为类中的成员

成员变量:类具有的特征【多个对象具有的共同的特征】,也称为属性

成员方法:类具有的行为【多个对象具有的共同的行为】

1.类体的实现

self:当前类对象

#需求:描述人类,特征:姓名,年龄    行为:跑步,吃饭
class Person():
    name = "qq"
    age = 20 
    def run(self):
        print("%s 在跑步" % self.name)
    def eat(self):
        print("%s 在吃饭" % self,name)
2.对象的创建

对象的创建过程其实就是定义一个类的变量【创建对象也被称为实例化对象】

num = 10

语法:变量名 = 对象

​ 对象名 = 类名()

from day50.duixiang.shili01 import Person
#使用类创建对象 方法就是类名()
if __name__ == "__main__":
    a = 10
    print(a)
    print(type(a))#<class 'int'>
    print("++++++++++++++++++++++++++")
    person1 = Person()
    print(person1)#<shiti.shili001.Person object at 0x000002C7D40B3B70>
    print(type(person1))#<class 'shiti.shili001.Person'>
    print("+++++++++++")
    person2 = Person()
    print(person2)
    print(person1 is person2)
    print(id(person1))
    print(id(person2))
3.访问类中的成员

使用对象来访问成员
使用对象.的方式来访问
person1 = Person()
person1.name
person1.run()

from day50.duixiang.shili01 import Person

if __name__ == "__main__":
    person01 = Person()
    person01.name = "张飞"
    person01.age = 30
    person01.run()
    person01.eat()
4.综合练习
4.1 练习1

需求:开学了,张老师让学生【小明,小花,小丽】做自我介绍

要求:姓名,年龄,爱好,来一段才艺展示

"""
分析
 老师类
     特征:姓名
     行为;让。。。。。

 学生类
     特征:姓名,年龄,爱好
     行为:作自我介绍,来一段才艺展示
"""
class Student():
    #成员变量
    name = ""
    age = 10
    hobby = ""
    def introduce(self):
        print("我叫 %s 年龄 %d 爱好 %s" %(self.name,self.age,self.hobby))
class Teacher():
    #成员变量
    name = ""
    def let_stu_caiyi(self,stu:Student):
        print("======%s=====" % self.name)
        stu.introduce()

if __name__ =="__main__":
    xm = Student()#xm--变量 称之为对象的引用 右边是对象的实体 对象的引用指向了对象的实体
    xm.name = "小明"
    xm.age = 11
    xm.hobby = "乒乓球"
    xh = Student()
    ls = Teacher()
    ls.let_stu_caiyi(xm)

四、动态绑定属性和限制绑定

对象的属性除了定义之外 还可以动态加入属性

slots:限定可以绑定的属性

class Person():
    __slots__ = ("sex","email")#限定可以绑定的属性
    name = "qq"
    age = 10
    def show(self):
        print(self.name,self.age)
p1 = Person()
print(p1)
print(p1.name)
print(p1.age)
p1.sex = "man"
print(p1.sex)

五、构造函数和析构函数

1.构造函数

作用:主要用于创建对象并将对象的数据做出初始化

构造函数,也被称为构造器,指的是当创建对象的时候,被自动调用的函数

语法:
def __init__(self):

​ pass

def __str__(self):返回字符串形式

1.1 例1
class Person():
    #空参函数
    def __init__(self):
        print("++++++++构造函数被调用+++++++")
p1 = Person()#构造函数在创建对象的时候就会被调用
print("++++++++++++++++++++++")
#带参函数
class Person2():
    def __init__(self,name):
        self.name = name
    def __str__(self):
        return "姓名:"+self.name
p2 = Person2("张飞")
print(p2)
print("++++++++++++++++++++++")
class Person3():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return "姓名:"+self.name + " 年龄:" + str(self.age)
p3 = Person3("刘备",30)
print(p3)
2.案例
2.1 案例1

需求:开学了,张老师让学生【小明,小花,小丽】做自我介绍

要求:姓名,年龄,爱好,来一段才艺展示

分析
老师类
特征:姓名
行为:让。。。。。

学生类
特征:姓名,年龄,爱好
行为:作自我介绍,来一段才艺展示

class Student():
    def __init__(self,name,age,hobby):
        self.name = name
        self.age = age
        self.hobby = hobby
    def show(self):
        print("我叫 %s ,年龄是:%s ,爱好是:%s" % (self.name,self.age,self.hobby))
class Teacher():
    def __init__(self,name):
        self.name = name
    def let(self,stu:Student):
        print(self.name)
        stu.show()
print("++++++++++++++++++++++")
p1 = Student("小明",20,"打篮球")
p2 = Student("小花",21,"唱歌")
p3 = Student("小丽",23,"跳舞")
t1 = Teacher("李老师")
t1.let(p1)
t1.let(p2)
t1.let(p3)
2.2 案例2

构造一个圆,求该圆的面积和周长,判断一个点和圆之间的关系

对象:圆心,圆,一个点

类:
圆类
特征:圆心和半径
行为:面积和周长
点类
特征:x坐标和y坐标

import math
class Point():
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def __str__(self):
        return "横坐标是:%s  纵坐标是:%s" % (self.x,self.y)
class Circle():
    def __init__(self,o,r):
        self.r = r
        self.o = o
    def __str__(self):
        return "圆心是:%s  半径是:%s" % (self.o,r)
    def per(self):
        return 2 * math.pi * self.r
    def area(self):
        return math.pi * r ** 2
    def rs(self,point:Point):
        length = math.sqrt((point.x - self.o.x) ** 2 + (point.y - self.o.y) ** 2)
        if length > r:
            return "点在圆外"
        elif length == r:
            return "点在圆上"
        else:
            return "点在圆内"
p1 = Point(1,2)
print(p1)
r = 3
circle1 = Circle(p1,r)
print(circle1)
print(circle1.per())
print(circle1.area())
p2 = Point(3,5)
print(circle1.rs(p2))
2.3 案例3

时钟类

特征:时分秒

行为:走针

class Clock():
    def __init__(self,hour,min,sec):
        self.hour = hour
        self.min = min
        self.sec = sec
    def __str__(self):
        return str(self.hour)+":"+str(self.min)+":"+str(self.sec)
    def running(self):
        if self.hour == 11 and self.min == 59 and self.sec == 59:
            self.hour = 0
            self.min = 0
            self.sec = 0
        elif self.min == 59 and self.sec == 59:
            self.hour += 1
            self.min = 0
            self.sec = 0
        elif self.sec == 59:
            self.min += 1
            self.sec = 0
        else:
            self.sec += 1
print("++++++++++++++++++++++++++++")
clock = Clock(11,59,59)
clock.running()
print(clock)
3.def __str__(self):

这个方法的作用是 复写(上帝类) 父类的将对象转换成字符串的方法,就是说如果这个方法被重写,打印对象的时候就会以这个方法的规则来打印对象,这个方法的返回值就是这个对象的字符串的存在形式

class Person():
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    def __str__(self):
        return self.name + "--" + str(self.age) + "--" + self.sex
p1 = Person("张飞",30,"man")
print(p1)
4.析构函数

和构造函数相反,当对象被销毁的时候自动调用的函数,被称为析构函数,函数名为__del__

对象被销毁的时机:

a.程序执行完毕,对象的生命周期自然完成

b.程序还未执行完毕,但是手动销毁对象:del 变量名

一个对象被回收的前提是没有任何一个引用指向这个对象

import time
class Person():
    def __init__(self,name):
        self.name = name
        print("===构造了一个对象==" + self.name)
    def __del__(self):
        print("==析构函数被调用了== %s 被回收了" % self.name )
print("+++++++++++++++++")
print("+++++++++++begin++++++++++++++")
p1 = Person("武松")
p2 = Person("张飞")
p3 = Person("宋江")
p4 = p1
del p1#删除p1,自动调用del
time.sleep(5)
del p3
time.sleep(5)

四、封装

1.概念

封装的好处:提高了数据的安全性,提高了数据的复用性

私有可以用到类体中

2.属性未被私有化
class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return self.name +" " + str(self.age)
print("++++++++++++++++++++++++++")
p1 = Person("武松", 30)
print(p1)
print(p1.name)
3.属性私有化,提供get和set方法
class Person:
    def __init__(self,name,age):
        self.__name = name
        self.__age = age
    def __str__(self):
        return self.__name + " " + str(self.__age)
    def getName(self):
        return self.__name
    def setName(self,new_name):
        self.__name = new_name
    def getAge(self):
        return self.__age
    def setAge(self,new_age):
        self.__age = new_age
print("++++++++++++++++++")
p1 = Person("武松",28)
print(p1)
print(p1.getName())
p1.setName("武力")
print(p1)
4.@property装饰器

装饰器:可以给函数动态的增加功能,对于类的成员函数,装饰器同样可以使用

Python内置的装饰器@property的作用:将一个函数当做属性访问

注意:@property可以单独使用,也可以和@属性名.setter组合使用【@属性名.setter只能有@property生成】

作用:使用在类的成员函数中,可以 简化代码,可以提高代码的复用性,同时也可以保证对参数进行校验

@property 这是一个获取属性的方法

@属性.setter 这是一个属性的set方法

# 使用装饰器@property 和 @xxx.setter 来完成get和set方法
class Person:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    def __str__(self):
        return self.__name + " " + str(self.__age)
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self,name):
        self.__name = name
    @property
    def age(self):
        return self.__age
    @age.setter
    def age(self,age):
        self.__age = age
if __name__ == "__main__":
    p1 = Person("张飞",22)
    print(p1)
    print(p1.name)
    print(p1.age)
    p1.name = "刘备"
    p1.age = 24
    print(p1)
5 练习
"""
1.使用封装的思想结合列表完成下面题目
	学生类:姓名、年龄、学号、成绩
	班级类:班级名称、学生列表
		显示所有学生
		根据学号查找学生
		添加一个学生
		删除一个学生(学生对象、学号)
		根据学号升序排序
		根据成绩降序排序
"""
class Student():
    def __init__(self,name,age,id,score):
        self.__name = name
        self.__age = age
        self.__id = id
        self.__score = score
    def __str__(self):
        return self.__name + " " + str(self.__age) + " " + str(self.__id) +" " + str(self.__score)
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self,name):
        self.__name = name
    @property
    def age(self):
        return self.__name
    @age.setter
    def age(self,age):
        self.__age = age
    @property
    def id(self):
        return self.__id
    @id.setter
    def id(self,id):
        self.__id = id
    @property
    def score(self):
        return self.__score
    @score.setter
    def score(self,score):
        self.__score = score

class Class():
    def __init__(self,name,stu_list:list):
        self.__name = name
        self.__stu_list = stu_list
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self,name):
        self.__name = name
    @property
    def stu_list(self):
        return self.__stu_list
    @stu_list.setter
    def stu_list(self,stu_list):
        self.__stu_list = stu_list
    def all_stu(self):
        for stu in self.__stu_list:
            print(stu)
    def select_stu(self,id):
        for stu in self.__stu_list:
            if stu.id == id:
                return stu
            return None
    def add_stu(self,student):
        self.__stu_list.append(student)
    def del_stu(self,id):
        for stu in stu_list:
            if stu.id == id:
                self.__stu_list.remove(stu)
    def sort_id(self):
        for i in range(len(self.__stu_list)-1):
            for j in range(len(self.__stu_list)-1-i):
                if self.__stu_list[j].id > self.__stu_list[j+1].id:
                    self.__stu_list[j],self.__stu_list[j+1] = self.__stu_list[j+1],self.__stu_list[j]
        self.all_stu()
    def sort_score(self):
        for i in range(len(self.__stu_list)-1):
            for j in range(i+1,len(self.__stu_list)):
                if self.__stu_list[i].score < self.__stu_list[j].score:
                    self.__stu_list[i],self.__stu_list[j] = self.__stu_list[j],self.__stu_list[i]
        self.all_stu()

if __name__ == "__main__":
    stu1 = Student("小明",20,117,80)
    stu2 = Student("小红",29,107,99)
    stu3 = Student("小成",22,127,78)
    stu4 = Student("小紫",25,118,86)
    stu5 = Student("小兰",24,108,84)
    stu6 = Student("小亮",22,8,77)
    stu_list = []
    stu_list.extend([stu1,stu2,stu3,stu4,stu5])
    class1 = Class("冲锋班",stu_list)
    print(class1.name)
    print("++++++++++++++++++")
    class1.all_stu()
    print("++++++++++++++++++")
    class1.add_stu(stu6)
    class1.all_stu()
    print("++++++++++++++++++")
    class1.del_stu(8)
    class1.all_stu()
   print("++++++++++++++++++")
    class1.sort_id()
    print("++++++++++++++++++")
    class1.sort_score()

五、继承(重点)

1.概念

如果两个或者两个以上的类中具有相同的属性或者方法,我们可以抽取一个类出来,在该类中定义相同的属性或者方法

​ 被抽取出来的类 -----> 父类 超类【super】 基类【base】

​ 两个或者两个以上的类 ------> 子类 派生类

​ 他们之间的关系:子类 继承自 父类

​ 父类 派生了 子类

继承只能继承非私有的,私有只能本类使用

2.单继承

单继承:一个子类只能继承自一个父类

语法:

​ 父类:

​ class 父类类名(object):

​ 类体【共同的属性或者方法】

​ 子类:

​ class 子类类名(父类类名):

​ 类体【特有的属性或者方法】

注意:如果一个类没有明确的父类,则默认继承自object

# 1.父类是上帝,上帝定义的属性及方法,所有的类都共同拥有,
# 因为所有的类都直接或者间接的继承了上帝
class ZiMin():
    pass
zimin = ZiMin()
print(zimin)

# 2.单继承, 只能继承父类中非私有的属性和方法
class Animal():
    def __init__(self,color):
        self.color = color
    def eat(self):
        print("===动物吃====")

class MaoKe(Animal):#继承了动物
    def __init__(self,name):
        self.name = name
    def bu_lie(self):
        print("==%s==%s==在捕猎 " % (self.color,self.name))

class Mao(MaoKe):#继承了猫科
    def __init__(self,zhuren):
        self.zhuren = zhuren
    def chi_yu(self):
        print("==%s==%s==%s 在吃鱼" % (self.color,self.name,self.zhuren))

if __name__ == "__main__":
    mao = Mao("张飞")
    mao.name = "张飞家的猫"
    mao.color = "黄白"
    mao.eat()
    mao.bu_lie()
    mao.chi_yu()
# 3. 人 name,age
# 学生:学号
# 医生:科室
# 律师:分类
# 在子类构造函数中,一般可以使用super().__init__(name.age)调用父类的构造函数
# 因为自类一般都在父类属性上扩展属性 所有子类属性一般都多于父类
class Person():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def wan(self):
        print("===一起摇摆====")
    def __str__(self):
        return self.name + " " + str(self.age)
class Student(Person):
    def __init__(self,name,age,xue_hao):
        super().__init__(name,age)
        self.xue_hao = xue_hao
    def study(self):
        print("=====day day up=======")
    def __str__(self):
        return super().__str__() + " " +self.xue_hao

class Doctor(Person):
    def __init__(self,name,age,ke_shi):
        super().__init__(name,age)
        self.ke_shi = ke_shi
    def shou_shu(self):
        print("=====冷静做手术======")
    def __str__(self):
        return super().__str__() + " " + self.ke_shi

class Lawyer(Person):
    def __init__(self,name,age,fen_lei):
        super().__init__(name,age)
        self.fen_lei = fen_lei
    def da_guan_si(self):
        print("=====为魔鬼歌颂=======")
    def __str__(self):
        return super().__str__() + " " + self.da_guan_si()

if __name__ == "__main__":
    stu1 = Student("燕青",20,"0009")
    print(stu1)
    stu1.wan()
    stu1.study()
    print("+++++++++++++++++++")
    doc1 = Doctor("扁鹊",40,"全科")
    print(doc1)
    doc1.shou_shu()
    doc1.wan()
    print("++++++++++++++++++++")
    lay = Lawyer("律师",30,"事故")
    lay.wan()
    lay.da_guan_si()
"""
构造函数的调用
"""
class Fu():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return self.name +"----"+str(self.age)
    def gong_neng1(self):
        print("====fu===功能方法=====")
class Zi(Fu):
    pass
class Zi2(Fu):
    def __init__(self,name,age,panni):
        super().__init__(name,age)#调用父类构造函数
        self.panni = panni
    def __str__(self):
        return super().__str__() +"---"+self.panni
    def gong_neng1(self):
        print("=====zi-----功能001====")
print("++++++++++++++++++++++++++++++++")
if __name__ == "__main__":
    zi1 = Zi("zi001",20)
    print(zi1)
    zi1.gong_neng1()
    print("++++++++++++++++++++++++++++++")
    zi2 = Zi2("zi2002",16,"自增属性")
    print(zi2)
    zi2.gong_neng1()
3.多继承

案例一

"""
多继承
一个类拥有多个父类
可以拥有多个父类的功能
"""
class Runnable():
    def __init__(self,name):
        self.name = name
    def run(self):
        print("====%s-==在奔跑====" % self.name)
    def __str__(self):
        return self.name
class Flyable():
    def fly(self):
        print("=====翱翔=====")
class Dark(Runnable,Flyable):
    def __str__(self):
        return super().__str__()
    def __init__(self,name):
        super().__init__(name)
print("++++++++++++++++++++++++++++++++++")
if __name__ == "__main__":
    d1 = Dark("唐老鸭")
    print(d1)
    d1.run()
    d1.fly()

案例2

"""
多继承的2

"""
class Father():
    def __init__(self,money):
        self.money = money
    def work(self):
        print("=====一般人都得上班======")
    def show(self):
        print("====father===show")
    def __str__(self):
        return self.money
class Mother():
    def __init__(self,value):
        self.value = value
    def guan_money(self):
        print("=======花money======")
    def show(self):
        print("=====mother===show=====")
    def __str__(self):
        return self.value
class Child(Father,Mother):
    def __init__(self,money,value,ziwo):
        #super()
        Father.__init__(self,money)
        Mother.__init__(self,value)
        self.ziwo = ziwo
    def show(self):
        Father.show(self)
        Mother.show(self)
        print("==================功能扩展=====")
    def __str__(self):
        return str(Father.__str__(self)) + "---"+Mother.__str__(self)+"----"+self.ziwo
print("+++++++++++++++++++++++++++++++++")
if __name__ == "__main__":
    zi = Child(99999,"价值","特有属性")
    print(zi)
    zi.work()
    zi.guan_money()
    zi.show()
4.函数的重写

重写:override,在继承关系中,如果在子类中出现了和父类重名的函数,则称为子类重写了父类中的函数

4.1自定义函数的重写

函数的重写 — 子类对父类的功能不满意

1:功能扩展

2:彻底覆盖

class Fu():
    def sing(self):
        print("=====sing===香水有毒====")
class Zi(Fu):
    def sing(self):
        supper().sing()#保留父类的功能
        print("+++在这个功能上进行扩展===sing ===双节棍")
class Zi2(self):
    def sing(self):
        print("========sing==孤勇者===")
zi1 = Zi()
zi1.sing()
print("++++++++++++++++++++++")
zi2 = Zi2()
zi2.sing()

六、多态

1.概念

一种事物的多种体现形式,举例:动物有很多种

定义时的类型和运行时的类型不一致,当定义了一个变量,代表某个对象,只有当程序运行的时候,才能确定该变量指向哪个对象,调用哪个函数

注意:继承是多态的前提

作用:有了继承,才能提到多态,在调用类的成员函数的时候,尽量将参数类型视为父类类型,这样,所有的子类类型都可以被正常接收,多态可以起到简化代码的作用

2.使用
"""
一个事物的多种体现形态
"""
class Animal():
    pass
class Mao(Animal):
    pass
if __name__ == "__main__":
    a = Animal()
    print(isinstance(a,Animal))#True
    print(isinstance(a,Mao))#False
    mao = Mao()
    print(isinstance(mao,Animal))#True
    print(isinstance(mao,Mao))#True
    
"""
在调用时才可以确定实际类型
"""
class Animal():
    def __init__(self,name):
        self.name = name
    def eat(self):
        print("----动物吃===")
class Mao(Animal):
    def eat(self):
        print("====猫吃鱼====")
class Sheep(Animal):
    def eat(self):
        print("=====羊吃草====")
class Wolf(Animal):
    def eat(self):
        print("====狼吃羊=====")
class Person():
    def wei_shi(self,animal:Animal):
        animal.eat()
print("+++++++++++++++++++++++++++++++++++")
if __name__ == "__main__":
    p1 = Person()
    mao = Mao("小猫咪")
    yang = Sheep("喜羊羊")
    wolf = Wolf("红太狼")
    p1.wei_shi(mao)
    p1.wei_shi(yang)
    p1.wei_shi(wolf)

七、获取对象信息

1.type()

  • 获取一个变量的类型,返回值为:<class ‘类名’>,属于class类型

2.isinstance()

  • 判断一个对象是否属于某种数据类型

3.dir()

  • 获取一个类或者对象的属性或者方法,返回值为一个列表
  • dir可以随时查看一个对象的信息
print(dir("qq"))
class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return self.name + " " + str(self.age)
    def fun1(self):
        pass
    def fun2(self):
        pass
p1 = Person("qq",20)
print(p1)
print(dir(p1))

八、类中特殊的成员

1.类属性和成员属性【面试题】

面试题:简述类属性和成员属性的区别

1.定义的位置不同:类属性直接定义在类中,成员属性定义在构造函数中或者动态绑定

2.访问的方式不同:类属性可以使用对象访问,也可以使用类名访问,但是,成员属性只能使用对象访问

3.优先级不同:当类属性和成员属性重名的情况下,使用对象访问优先访问的是成员属性

4.在内存中出现的时机不同:类属性随着类的出现而出现,成员属性随着对象的出现而出现【类属性优先于成员属性在内存中出现】

5.使用场景不同:多个对象共享的数据定义为类属性,每个对象特有的数据定义为成员属性

class Person():
    guo_ji = "cn"
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return self.name + "==="+str(self.age)
print("+++++++++++++++++++++++++++++++")
print(Person.guo_ji)
p1 = Person("关羽",20)
print(p1.name)
print(p1.age)
print(p1.guo_ji)
print("+++++++++++++++++++++++++++")
p2 = Person("张飞",18)
print(p2.name)
print(p2.age)
print(p2.guo_ji)
print("+++++++++++++++++++++++++++++++")
Person.guo_ji = "kk"
print(p1.guo_ji)
print(p2.guo_ji)
2.类方法和静态方法【面试题】

面试题:简述成员函数,类函数和静态函数之间的区别
不同点

1.是否使用装饰器修饰:使用@classmethod修饰则是类函数,使用@staticmethod修饰则是静态函数,没有任何修饰则是成员函数

2.形参列表不同:

  • 成员函数的第一个形参必须为self,类函数的第一个形参必须为cls,
  • 静态函数的形参没有要求【self和cls都不是关键字,都可以是普通的标识符,self表示当前的实例,cls表示当前类】

3.调用方式不同:成员函数只能通过对象调用,但是,类函数和静态函数既可以使用对象调用,也可以使用类名调用

4.使用场景不同:如果需要封装工具类,该类中的函数一般采用静态函数或者类函数,但是,如果涉及到对象的操作,一般使用成员函

相同点

1.三者都可以被子类继承,同时也可以在子类中进行重写,子类对象优先调用的是子类中的函数

2.三者都可以使用默认参数,关键字参数,不定长参数

class Person():
    def show(self):
        print("====这是一个普通方法====")
    #类方法
    @classmethod
    def lei_fun1(cls):
        print("====这是一个类方法===")
    #静态方法
    @staticmethod
    def jingtai_fun():
        print("====这是一个静态方法===")

print("===静态方法和类方法本质上都属于类,不属于成员===")
if __name__ == "__main__":
    Person.lei_fun1()
    Person.jingtai_fun()
    #Person.show()--不能使用类.  的方式调用成员函数
    print("+++++++++++++++++++++++++++++++")
    p1 = Person()
    p1.show()
"""
一般可以使用静态方法来去实现工具类
math
time
"""
class ListTools():
    # 这是一个列表的工具类
    # 一般在工具类中提供大的都是静态方法
    @staticmethod
    def bian_li(list1):
        for ele in list1:
            print(ele,end=",")
        print()
    # 求列表的最大值
    @staticmethod
    def get_max(list1):
        max1 = list1[0]
        for i in range(len(list1)):
            if list1[i] > max1:
                max1 = list1[i]
        return max1

    #进行冒泡排序
    @staticmethod
    def mao_pao(list1):
        for i in range(len(list1)-1):
            for j in range(len(list1)-1-i):
                if list1[j] > list1[j+1]:
                    list1[j],list1[j+1] = list1[j+1],list1[j]


if __name__ == "__main__":
    list1 = [1,20,333,45,22,78,444]
    ListTools.bian_li(list1)
    print("++++++++++++++++++++++")
    ListTools.mao_pao(list1)
    print(list1)
    print("++++++++++++++++++++")
    max1 = ListTools.get_max(list1)
    print(max1)
3.属性

__name__:获取类名字符串,只能通过类名访问

__dict__:返回的结果都是一个字典

  • 通过类名访问,获取类的内容,包括成员函数,静态函数和类函数,以及系统函数,类属性
  • 通过对象访问,获取对象的内容,包括成员属性

__bases__基类,结果为一个元组,通过类名访问,获取指定类的所有的父类

class Fu():
    pass
class Person():
    def __init__(self,name):
        self.name = name
    def show(self):
        pass
    def show2(self):
        pass
    def show3(self):
        pass
class Stu():
    pass

if __name__ == "__main__":
    print(Person.__name__)#Person
    print(Stu.__name__)#Stu
    print("+++++++++++++++++++")
    print(Person.__dict__)
    print("++++++++++++++++++++")
    p1 = Person("qq")
    print(p1.__dict__)
    print("++++++++++++++++++++++++")
    print(Person.__base__)#只显示直接的父类
    print(p1.__hash__())#173122810011

九 文件读写

1.写文件

open(path,flag,encoding)

  • path:要打开的文件的路径【相对路径和绝对路径】

  • flag:

    • r:只读 rb:以只读的方式打开一个二进制文件
    • w:写 wb:以写的方式打开一个二进制文件
    • a:追加
  • encoding:编码格式

    • utf-8/UTF-8/utf8/UTF8/uTF-8
    • gbk/GBK
#1.打开文件
file = open(r"路径","w",encoding="utf8")
print(file)
print("===之前没有就会创建===")
file.write("hello python\n")
file.write("killer is comming\n")
file.flush()#刷新
file.close()
print("+++++++++++++++++++++")
file2 = open(r"文件地址","a",encoding="utf8")# a -- 给文件后面追加
print(file2)
file2.write("today is today")
file2.flush()
file2.close()
print("======over=======")
2. 读文件

read

  • read():默认一次性读取指定文件中的全部数据,不管该文件中有多少个字节 文件内容较少
  • read(size):一次读取指定size个字节,

readline

  • readline():一次只能读取一行,根据换行符判断,只针对文本文件(图片没有行)
  • readline(size):一次读取指定size个字节,用法类似read
2.1 读取文本文件
file1 = open(r"文件路径","r",encoding="utf8")#打开文件
print("===open success===")
result = file1.read()#读取动作
print(result)
file1.close()#关闭流
print("++++++++++++++++++++++++")
file2 = open(r"文件路径","r",encoding="utf8")
jieguo1 = file2.read(15)
jieguo2 = file2.read(15)#接着上一次的继续往下读
print(jieguo1)
print(jieguo2)
print("++++++++ readline ++++++++++")
file3 = open(r"文件路径","r",encoding="utf8")
line1 = file3.readline()
line2 = file3.readline()
print(line1)
print(line2)
2.2 读取非文本文件(图片,音频或视频等)
file1 = open(r"文件路径","rb")
result = file1.read()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JaEzQPoB-1679826628527)(C:\Users\11700\AppData\Roaming\Typora\typora-user-images\image-20220520111126082.png)]

3 文件的copy
3.1 拷贝文本文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ep4M8Ys-1679826628528)(C:\Users\11700\AppData\Roaming\Typora\typora-user-images\image-20220520111804338.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ecBGCz0N-1679826628528)(C:\Users\11700\AppData\Roaming\Typora\typora-user-images\image-20220520111817206.png)]

3.2 拷贝所有文件
def copy_file(old,new):
    du_liu = open(old,"rb")
    xie_liu = open(new,"rb")
    jieguo = du_liu.read()
    xie_liu.write(jieguo)
    xie_liu.flush()
    du_liu.close()
    xie_liu.close()
    print("===拷贝完成===")

file1 = r"文件地址"
file2 = r"文件地址"
copy_file(file1,file2)
4. csv文件的读写
4.1 写文件

用csv特有的方式进行写入

newline的默认值为\n,如果不希望每行后面有个空行,则重置newline的值

注意:写入的时候调用csv.writer生成了一个空的可迭代对象 将open的流对象以参数传递给writer,使用writer的返回值对象 进行写行result.writerow(sublist)

import csv
file = open(r"文件路径","w",newline=" ")
result = csv.writer(file)
xie_content = [["qq",20,"man"],["ww",23,"woman"],["ss",30,"man"]]
for i in xie_content:
    result.writerow(i)
file.close()
print("=====success=====")
#写一个文件yonghu.py 定义一个用户类
class User:
    def __init__(self,name,age,pw):
        self.name = name
        self.age = age
        self.pw = pw
    def __str__(self):
        return self.name + "--" + str(self.age) + "--" +self.pw    
#调用yonghu.py 这个文件
import csv
from day52.yonghu import User

u1 = User("qq",20,"123")
u2 = User("ww",25,"111")
u3 = User("ee",23,"222")
list1 = [u1,u2,u3]
list2 = []
for u in list1:
    list = []
    list.extend([u.name,u.age,u.pw])
    list2.append(list)
file1 = open(r"E:\oo.csv","w",newline="")
result1 = csv.writer(file1)
for user in list2:
    result1.writerow(user)
file1.close()
print("===写入成功===")
class YongLi():
    def __init__(self,id,name,step,result):
        self.id = id
        self.name = name
        self.step = step
        self.result = result
    def __str__(self):
        return str(self.id) + self.name + self.step + self.result
    
    
import csv
file1 = open(r"E:\yong_li.csv","w",newline="")
result = csv.writer(file1)
list_yl = []
for i in range(10):
    list = []
    yongli = YongLi("00"+str(i),"用例"+str(i),"step"+str(i),"result"+str(i))
    list.extend([yongli.id,yongli.name,yongli.step,yongli.result])
    list_yl.append(list)
for yl in list_yl:
    result.writerow(yl)
file1.close()
print("+++++++++写入成功++++++++++++")
4.2 读文件
import csv

file1 = open(r"E:\oo.csv","r")
result = csv.reader(file1)
for i in result:
    print(i)
file1.close()
5. 练习
import os
class FileTools():
    @staticmethod
    def create_dir(path):
        if not os.path.exists(path):
            os.mkdir(path)
        print("===文件创建成功===")
    @staticmethod
    def write_file(path,content):
        if not os.path.exists(path):
            file = open(path,"w")
        else:
            file = open(path,"a")
        file.write(content)
        file.flush()
        file.close()
    @staticmethod
    def read_file(path):
        file = open(path,"r")
        result = file.read()
        file.close()
        return result
    @staticmethod
    def get_all_files(path):
        if not os.path.exists(path):
            print("=====目录不存在=====")
            return
        if os.path.isfile(path):
            print("===文件名 %s ==" % path)
        files = os.listdir(path)
        for file in files:
            file_name = os.path.join(path,file)
            if os.path.isfile(file_name):
                print("===文件名 %s ==" % file)
                result = FileTools.read_file(file_name)
                print(result)
            else:
                FileTools.get_all_files(file_name)
print("+++++++++++++++++++++++++++++++++++")
from day52.filetools import FileTools

if __name__ == "__main__":
    FileTools.create_dir(r"E:\qq")
    FileTools.create_dir(r"E:\qq\uu")
    FileTools.write_file(r"E:\qq\uu\aa.txt","hellow world\n")
    result = FileTools.read_file(r"E:\qq\uu\aa.txt")
    print(result)
    FileTools.get_all_files(r"E:\qq")

类属性

  • 通过对象访问,获取对象的内容,包括成员属性

__bases__基类,结果为一个元组,通过类名访问,获取指定类的所有的父类

class Fu():
    pass
class Person():
    def __init__(self,name):
        self.name = name
    def show(self):
        pass
    def show2(self):
        pass
    def show3(self):
        pass
class Stu():
    pass

if __name__ == "__main__":
    print(Person.__name__)#Person
    print(Stu.__name__)#Stu
    print("+++++++++++++++++++")
    print(Person.__dict__)
    print("++++++++++++++++++++")
    p1 = Person("qq")
    print(p1.__dict__)
    print("++++++++++++++++++++++++")
    print(Person.__base__)#只显示直接的父类
    print(p1.__hash__())#173122810011

九 文件读写

1.写文件

open(path,flag,encoding)

  • path:要打开的文件的路径【相对路径和绝对路径】

  • flag:

    • r:只读 rb:以只读的方式打开一个二进制文件
    • w:写 wb:以写的方式打开一个二进制文件
    • a:追加
  • encoding:编码格式

    • utf-8/UTF-8/utf8/UTF8/uTF-8
    • gbk/GBK
#1.打开文件
file = open(r"路径","w",encoding="utf8")
print(file)
print("===之前没有就会创建===")
file.write("hello python\n")
file.write("killer is comming\n")
file.flush()#刷新
file.close()
print("+++++++++++++++++++++")
file2 = open(r"文件地址","a",encoding="utf8")# a -- 给文件后面追加
print(file2)
file2.write("today is today")
file2.flush()
file2.close()
print("======over=======")
2. 读文件

read

  • read():默认一次性读取指定文件中的全部数据,不管该文件中有多少个字节 文件内容较少
  • read(size):一次读取指定size个字节,

readline

  • readline():一次只能读取一行,根据换行符判断,只针对文本文件(图片没有行)
  • readline(size):一次读取指定size个字节,用法类似read
2.1 读取文本文件
file1 = open(r"文件路径","r",encoding="utf8")#打开文件
print("===open success===")
result = file1.read()#读取动作
print(result)
file1.close()#关闭流
print("++++++++++++++++++++++++")
file2 = open(r"文件路径","r",encoding="utf8")
jieguo1 = file2.read(15)
jieguo2 = file2.read(15)#接着上一次的继续往下读
print(jieguo1)
print(jieguo2)
print("++++++++ readline ++++++++++")
file3 = open(r"文件路径","r",encoding="utf8")
line1 = file3.readline()
line2 = file3.readline()
print(line1)
print(line2)
2.2 读取非文本文件(图片,音频或视频等)
file1 = open(r"文件路径","rb")
result = file1.read()

[外链图片转存中…(img-JaEzQPoB-1679826628527)]

3 文件的copy
3.1 拷贝文本文件

[外链图片转存中…(img-2ep4M8Ys-1679826628528)]

[外链图片转存中…(img-ecBGCz0N-1679826628528)]

3.2 拷贝所有文件
def copy_file(old,new):
    du_liu = open(old,"rb")
    xie_liu = open(new,"rb")
    jieguo = du_liu.read()
    xie_liu.write(jieguo)
    xie_liu.flush()
    du_liu.close()
    xie_liu.close()
    print("===拷贝完成===")

file1 = r"文件地址"
file2 = r"文件地址"
copy_file(file1,file2)
4. csv文件的读写
4.1 写文件

用csv特有的方式进行写入

newline的默认值为\n,如果不希望每行后面有个空行,则重置newline的值

注意:写入的时候调用csv.writer生成了一个空的可迭代对象 将open的流对象以参数传递给writer,使用writer的返回值对象 进行写行result.writerow(sublist)

import csv
file = open(r"文件路径","w",newline=" ")
result = csv.writer(file)
xie_content = [["qq",20,"man"],["ww",23,"woman"],["ss",30,"man"]]
for i in xie_content:
    result.writerow(i)
file.close()
print("=====success=====")
#写一个文件yonghu.py 定义一个用户类
class User:
    def __init__(self,name,age,pw):
        self.name = name
        self.age = age
        self.pw = pw
    def __str__(self):
        return self.name + "--" + str(self.age) + "--" +self.pw    
#调用yonghu.py 这个文件
import csv
from day52.yonghu import User

u1 = User("qq",20,"123")
u2 = User("ww",25,"111")
u3 = User("ee",23,"222")
list1 = [u1,u2,u3]
list2 = []
for u in list1:
    list = []
    list.extend([u.name,u.age,u.pw])
    list2.append(list)
file1 = open(r"E:\oo.csv","w",newline="")
result1 = csv.writer(file1)
for user in list2:
    result1.writerow(user)
file1.close()
print("===写入成功===")
class YongLi():
    def __init__(self,id,name,step,result):
        self.id = id
        self.name = name
        self.step = step
        self.result = result
    def __str__(self):
        return str(self.id) + self.name + self.step + self.result
    
    
import csv
file1 = open(r"E:\yong_li.csv","w",newline="")
result = csv.writer(file1)
list_yl = []
for i in range(10):
    list = []
    yongli = YongLi("00"+str(i),"用例"+str(i),"step"+str(i),"result"+str(i))
    list.extend([yongli.id,yongli.name,yongli.step,yongli.result])
    list_yl.append(list)
for yl in list_yl:
    result.writerow(yl)
file1.close()
print("+++++++++写入成功++++++++++++")
4.2 读文件
import csv

file1 = open(r"E:\oo.csv","r")
result = csv.reader(file1)
for i in result:
    print(i)
file1.close()
5. 练习
import os
class FileTools():
    @staticmethod
    def create_dir(path):
        if not os.path.exists(path):
            os.mkdir(path)
        print("===文件创建成功===")
    @staticmethod
    def write_file(path,content):
        if not os.path.exists(path):
            file = open(path,"w")
        else:
            file = open(path,"a")
        file.write(content)
        file.flush()
        file.close()
    @staticmethod
    def read_file(path):
        file = open(path,"r")
        result = file.read()
        file.close()
        return result
    @staticmethod
    def get_all_files(path):
        if not os.path.exists(path):
            print("=====目录不存在=====")
            return
        if os.path.isfile(path):
            print("===文件名 %s ==" % path)
        files = os.listdir(path)
        for file in files:
            file_name = os.path.join(path,file)
            if os.path.isfile(file_name):
                print("===文件名 %s ==" % file)
                result = FileTools.read_file(file_name)
                print(result)
            else:
                FileTools.get_all_files(file_name)
print("+++++++++++++++++++++++++++++++++++")
from day52.filetools import FileTools

if __name__ == "__main__":
    FileTools.create_dir(r"E:\qq")
    FileTools.create_dir(r"E:\qq\uu")
    FileTools.write_file(r"E:\qq\uu\aa.txt","hellow world\n")
    result = FileTools.read_file(r"E:\qq\uu\aa.txt")
    print(result)
    FileTools.get_all_files(r"E:\qq")
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值