python基础知识

你好世界!!!

# coding=utf-8
print('你好 世界!')

乘方

print(2**5)

变量

#定义变量
name = ‘小明’
print(name)
#变量多次赋值
name = '小红'
print(name)
# 多次赋值后会指向一个新的空间
name = '小刚'
print(name)

注意:= 是赋值 == 是条件判断

二进制与字符编码

print(chr(0b100111001011000)) #二进制要加上0b否则计算机不认识
print(ord(''))
# 20056 是一个十进制

转义字符和原字符

# 转义字符
print('hello\nworld')# 转义功能的首字符 \n表示换行
print('hello\tworld')# \t 表示空格 站位4个字符
print('helloooo\tworld')
print('hello\rworld')# \r 覆盖前面的
print('hello\bworld')# \b 退格键会把前面一个字符占了

print('http:\\\www.baidu.com') # \ 要被转一个
print('老师说:\'大家好\'')

# 原字符,不希望字符串中的转义字符起作用,就使用原字符,就是在原字符串之前加上r,或R
print(r'hello\neorld')
# 注意事项,最后一个字符不能是反斜杠
# print(r'hello\neorld\')
print(r'hello\neorld\\')

range()函数

# range() 的三种创建方式
'''第一种方式,只有一个参数(小括号中只给了一个数)'''
r=range(10) #[0,1,2,3,4,5,6,7,8,9]默认值从0开始默认相差1称为步长
print(r) #range(0, 10)
print(list(r)) #用于查看range对象中的整数序列  -->list列表的意思

'''第二种方式,给了两个参数(小括号中给了两个数)'''
r=range(1,10) #指定了起始值,从1开始 到10结束(不包含10),默认步长为1
print(list(r)) #[1, 2, 3, 4, 5, 6, 7, 8, 9]

'''第三种创建方式,给了三个参数(小括号中给了三个数)'''
r=range(1,10,2) #2指定了一个步长
print(list(r)) #[1, 3, 5, 7, 9]

'''判断指定的整数,在序列中是否存在 in,not in'''
print(10 in r) #False 10不在这个整数当中
print(9 in r) #True 9在这个整数当中

print(10 not in r)#True 10不在这个整数当中
print(9 not in r)#False 9在这个整数当中

if分支结构

单分支结构
money = 1000 #余额
s = int(input("请输入金额")) #取款金额
# 判断余额是否充足
if money >= s:
   money = money-s
   print('取款成功余额为',money)

双分支结构
# 从键盘录入一个整数判断是技术还是偶数
num = int(input('请输入一个整数'))
# 条件判断
if num%2 == 0:
    print(num,'是偶数')
else:
    print(num,'是奇数')

多分支结构
    # 从键盘录入一个整数 成绩
# 90-100 A
# 80-89 B
# 70-79 C
# 60-69 D
# 0-59 E
# 小于0或大于100 非法数据 (不是成绩的有效范围)
score = int(input('请输入一个成绩:'))
# 判断
if score> = 90 and score <= 100:
    print(score,'成绩为A')
elif score >= 80 and score <= 89:
    print(score,'成绩为B')
elif score >= 70 and score <= 79:
    print(score,'成绩为C')
elif score >= 60 and score <= 69:
    print(score,'成绩为D')
elif score >= 0 and score <= 59:
    print(score,'成绩为E')
elif score < 0 and score > 100:
    print(score,'输入错误')

嵌套if的使用
# 会员 >=200 八折
#      >=100 九折
#         不打折
# 非会员 >=200 9.5折
#         不打折

answer=input("你是会员吗?y/n    ")
# 外层判断是否是会员
if answer == 'y':
    print('会员')
    answer1 = int(input('请输入金额: '))
    if answer1 >= 200:
        print('打八折',answer1*0.8)
    elif answer1 >= 100:
        print('打九折',answer1*0.9)
    else:
        print('输入错误')
else:
    print('非会员')
    answer2 = int(input('请输入金额'))
    if answer2 >= 200:
        print('打八折', answer2 * 0.95)
    else:
        print('输入错误')

条件表达式
# 从键盘录入两个整数,比较两个整数的大小
num_a = int(input('请输入第一个整数:'))
num_b = int(input('请输入第二个整数:'))
# 比较大小
print('使用条件表达式进入比较')
print(str(num_a)+'大于等于'+str(num_b) if num_a>=num_b else str(num_a)+'小于'+str(num_b))

for循环

for in 循环
    for item in 'python': #第一次取出来的是P,将P赋值item,将item的值输出
        print(item)
    
    # range() 产生一个整数序列--> 也是一个可迭代对象
    for i in range(10):
        print(i)

二重循环中的break与continue
# 流程控制语句break与continue在二重循环中的使用
    for i in range(5):
        for j in range(1,11):
            if j%2 == 0:
                # break
                continue
            print(j,end='\t')
        print()


for in 练习_100到999之间的水仙花数
    #举例:
    #153 = 3*3*3+5*5*5+1*1*1
for irem in range(100,1000):
    ge = irem%10 #个位
    shi = irem//10%10 #十位
    bai = irem//100 #百位
    # 判断
    if ge**3+shi**3+bai**3==irem:
        print(irem)

嵌套循环
for i in range(1,10):
    for j in range(1,i+1):
        print(i,'*',j,'=',i*j,end='\t')
    print()

while循环

# 选择结构的if与循环结构while的区别
#     if是判断一次,条件为True执行一次
#     while是判断N+1次,条件为True执行N次
a = 1
# 判断条件表达式
while a < 10:
    # 执行条件运算符
    print(a)
    a += 1

# 计算0到4之间的累加和

# 4步循环法
#     1.初始化变量
#     2.条件判断
#     3.条件执行体(循环体)
#     4.改变变量
#     总结 初始化的变量与条件判断的变量与改变的变量为同一个
sum = 0 #存储
'''初始化变量为0'''
a = 0
'''条件判断'''
while a < 5:
    '''条件执行体(循环体)'''
    sum += a
    '''改变变量'''
    a += 1
print('和为',sum)

'''计算1到100之间的偶数和'''
sum = 0#用于存储偶数
'''初始化变量'''
a = 0
'''条件判断'''
while a <= 100:
    '''条件执行(求和)'''
    # 条件判断是否为偶数
    if not bool(a%2): #a%2==0:
        sum += a
    # 改变变量
    a += 1
print('1~100的偶数和',sum)

else pass continue break 控制流程语句

else语句
a = 0
while a < 3:
    pwd = input("请输入密码:")
    if pwd == '8888':
        print('密码正确')
        break
    else:
        print('密码不正确')
        a += 1
else:
    print('对不起,三次密码均输入错误')

# pass语句,什么都不做,只是一个占位符,用到需要写语句的地方
answer = input('你是会员吗?y/s   ')
# 判断是否是会员
if answer == 'y':
    pass
else:
    pass

控制流程语句break
a = 0
while a < 3:
    # 条件执行体(循环体)
    pwd = input("请输入密码:")
    if pwd == '8888':
        print('密码正确')
        break
    else:
        print('密码不正确')
    '''该变变量'''
    a += 1

控制流程语句continue
print('----------使用 continue-----------') #相当于跳过5的倍数
for item in range(1,51):
    if item%5 == 0:
        continue
    print(item)

break 和 continue语句的区别 break直接结束程序 continue跳出当前循环代码继续下面的代码

数据类型

常用的数据类型
#     整数类型 int 98
#     浮点数类型 float 3.145
#     布尔类型 bool True,False
#     字符串类型 str '我用python学习'

字符串类型
#     字符串类型被称为不可变的字符序列
#     可以用单引号双引号三引号 来定义字符串
str1 = '人数苦短我用python'
str2 = "人数苦短我用python"
str3 = '''人数苦短我用python'''
str4 = '''人数苦短
我用python'''
print(str1,type(str1))
print(str2,type(str2))
print(str3,type(str3))
print(str4,type(str4))

布尔类型
#     用来标识真假的值
#     True表示真 False表示假
    # 可以用转化为整数
    # true = 1
    # false = 0

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

# 布尔类型可以转换成整数计算
print(f1+1) #2   1+1的结果为2 true表示为1
print(f2+1) #1   0+1的结果为1 false表示为0

整数类型
# 可以表示,正数,负数,0
n1 = 90
n2 = -20
n3 = 0
print(n1,type(n1))
print(n2,type(n2))
print(n3,type(n3))
#整数可以表示为二进制,十进制,八进制,十六进制
print('十进制',118)
print('二进制',0b10101111) #二进制以0b开头 范围0~9
print('八进制',0o176) #八进制以0o开头 范围0~7
print('十六进制',0x1EAF) #十六进制以0x开头 1~9 A~F

a = 3.1415926
print(a,type(a))

n1 = 1.1
n2 = 2.2
n3 = 2.1
print(n1+n2) #因为以二进制的方式去存储所以浮点数计算时不精确
print(n1+n3)
# 解决方案
from decimal import Decimal
print(Decimal('1.1')+Decimal('2.2'))

type 查看数据类型

数据类型转换

print('----------float()函数 将他们转换为float函数类型-------')
s1 = '125.95'
f1 = '76'
ff = True
s3 = 'hello'
i = 98
print(type(s1),type(f1),type(ff),type(s3),type(i))
print(float(s1),type(float(s1)))
print(float(f1),type(float(f1)))
print(float(ff),type(float(ff)))
# print(float(s3),type(float(s3)))# 字符串中的数据如果是非数字串,则不能被转换

类型转换str()函数与int()函数
name = '张三'
age = 20
print(type(name),type(age))# 说明name与age的数据类型不相同
# print('我叫'+name+'今年'+age+'岁')# 当将str类型与int类型进行连接时,报错,解决方案,类型转换
print('我叫'+name+'今年'+str(age)+'')# 将int类型通过str() 函数转换为字符类型

print('------------str()将其他类型转成为str类型-------')
a = 10
b = 198.7
c = False
print(type(a),type(b),type(c))
print(str(a),str(b),str(c),type(str(a)),type(str(b)),type(str(c)))

print('------------int()将其它的类型转int类型-------')
s1 = '125'
f1 = 85.77
s2 = '52.25'
ff = True
s3 = 'hello'
print(type(s1),type(f1),type(s2),type(ff),type(s3))
print(int(s1),type(int(s1)))# 将str转成int类型,字符串为 数字串
print(int(f1),type(int(f1)))# float转成int类型,截取整数类型 往小取
# print(int(s2),type(int(s2))) 将str转成int类型,报错,因为字符串为小数串
print(int(ff),type(int(ff)))# 布尔类型True为1 所以转换为1的int类型
# print(int(s3),type(int(s3))) 字符里不是数字不能转,必须为数字串(整数)

字符串


 字符串
#     在python中字符串是基本数据类型,是一个不可变的字符序列
#
# 什么叫做字符串驻留机制呢
#     仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻
#     留池中,python的驻留机制对相同的字符串只保留一份拷贝,后续创建
#     相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的
#     变量

# 字符串的驻留机制
a = 'Python'
b = 'Python'
c = '''Python'''
print(a,id(a))
print(b,id(b))
print(c,id(c))

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

# 字符串的驻留机制的优缺点
#     当需要值相同的字符串时,可以直接从字符串池里拿出来避免频繁
#     的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是
#     会比较印象性能的

    # 在需要进行字符串拼接时建议使用str类型的join方法,而非+,因为join()
    # 方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象效率要比'+'效率高

格式占位符的两种方式
% 作用占用符 %s 字符串 %i或%d 整数 %f 浮点数 name = '小明' age = 17 tiz = 70.8 print('我的名字叫:%s,今年%d岁了,体重%f'%(name,age,tiz)) # {}作占位符 print('我的名字叫:{0},今年{1}岁了,体重是{2},我真的叫{0}'.format(name,age,tiz,name)) # f-string print(f'我叫{name},今年{age}岁,体重是{tiz}斤') print('%10d' % 99) #10表示的是宽度 print('%.3f' % 3.1415926) # .3 表示保存小数点后3位 # 同时表示宽度和精度 print('%10.3f' % 3.1415926) #一共总宽度为10,小数点后 3位 print('{0:.3}'.format(3.1415926)) # .3 表示一共是3位数 print('{0:.3f}'.format(3.1415926)) # .3表示是3位小数 print('{:10.3f}'.format(3.1415926)) #同时设置宽度和精度,一共是10位,3位是小数 字符串的比较 运算符>,>=,<,<=,==,!= 比较原理:两个字符进行比较时,比较的是其ordinal value(原始值),调用内置函数ord可以 得到指定字符的 的ordinal value 与内置函数ordinal对应的是内置函数chr,调用内置函数chr时指定ordinal value 可以得到其对应的字符 print('apple'>'app') # true print('apple'>'banana') #false 相当于97>98 >false print(ord('a'),ord('b')) print(ord('')) print(chr(97),chr(98)) #相当于AIIS值 print(chr(38889)) '''==与is的区别 ==比较的是value is 比较的是id是否相等''' a=b='python' c='python' print(a == b) #true print(b == c) #true print(a is b) #比较的是内存地址 print(a is c) #比较的是内存地址 print(id(a)) print(id(b)) print(id(c))
字符串的大小写转换
# upper() 把字符串中所有字符都转成大写字母 # lower() 把字符串中所有字符都转成小写字母 # swapcase() 把字符串中所有大写字母转换成小写字母,把所有小写字母都转换成大小字母 # capitalize() 把第一个字符都转换为大写,把其余字符都转换为小写 # title() 把每个单词的第一个字符转换为大写,把每个单词剩余字符转换为小写 # 字符串中的大小写转换的方法 s = 'hello.python' a = s.upper() #转成大写之后,会产生一个新的字符串对象 print(a,id(a)) print(s,id(s)) b=s.lower() #转换之后,会产生一个新的字符串对象 print(b,id(b)) print(s,id(s)) print(b == s) #判断内容是否相等 print(b is s) #False 地址不相等 没有驻留 s2 = 'hello,Python' print(s2.swapcase()) print(s2.capitalize()) print(s2.title())

字符串的劈分
#             从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表
#     split() 以通过参数sep指定劈分字符串是的劈分符
#             通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串会单独做为一部分
#
#              从字符串的右边开始劈分,默认劈分字符是空格字符串,返回的值都是一个列表
#     rsplit() 以通过参数sep指定劈分字符串是的劈分符
#              通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大劈分之后,剩余的子串会单独做为一部分
s = 'hello world Python'
lst = s.split()
print(lst)
s1 = 'hello|world|Python'
print(s1.split(sep = '|'))
print(s1.split(sep = '|',maxsplit = 1))

print('------------------------------------------')
'''rsplit()从右侧开始劈分'''
print(s.rsplit())
print(s1.rsplit('|'))
print(s1.rsplit(sep = '|',maxsplit = 1))

字符串切片操作
# 字符串是不可变类型 # 不具备增,删,改等操作 # 切片操作将产生新的对象 s = 'hello,python' s1 = s[:5] #由于没有指定起始位置,所以从0开始切 s2 = s[6:] #由于没有结束位置,所以切到字符串的最后一个元素 s3 = '!' newsstr = s1+s3+s2 print(s1) print(s2) print(newsstr) print('-------------------------------') print(id(s)) print(id(s1)) print(id(s2)) print(id(s3)) print(id(newsstr)) print('--------------切片[start:end:step]--------------------') print(s[1:5:1]) #从1开始截到5(不包括5)步长为1 print(s[::2]) #默认从0开始,没有写结束,默认到字符串的最后一个元素,步长为2,两个元素之间的索引间隔为2 print(s[::-1]) #默认从字符串的最后一个元素开始,到字符串的第一个元素结束,因为步长为负数 print(s[-6::1]) #从索引为-6开始,到字符串的最后一个元素结束,步长为1

字符串查询操作
# index() 查找子串substr第一次出现的位置,如果查找的子串不存在时,则抛出ValueError # rindex() 查找子串substr最后一次出现的位置,如果查找的子串不存在时,则抛出ValueError # find() 查找子串substr第一次出现的位置,如果查找的子串不存在时,则返回-1 # rfind() 查找子串substr最后一次出现的位置,如果查找的子串不存在时,则返回-1 # 字符串的查询操作 s = 'hello,hello' print(s.index('lo')) #3 print(s.find('lo')) #3 print(s.rindex('lo')) #9 print(s.rfind('lo')) #9 #print(s.index('k')) ValueError: substring not found print(s.rfind('k')) #-1 #print(s.rindex('k')) ValueError: substring not found print(s.rfind('k')) #-1
字符串其他操作方法 # 字符串的替换 replace() 第一个参数指定替换子串的字符串,该方法返回替换后得到的字符串,替换前的字符串不发 # 生变化,调用该方法时可以通过第三个参数指定最大替换次数 # 字符串的合并 join() 将列表或元组的字符串合并成一个字符串 s = 'hello,python' print(s.replace('python','java')) s1 = 'hello,python,python,python' print(s1.replace('python','java',2)) lst = ['hello','java','python'] print('|'.join(lst)) print(''.join(lst)) t = ('hello','java','python') print(''.join(t)) print('*'.join('python'))
字符串内容对齐操作
# center() 居中对齐 # ljust() 左对齐 # rjust() 右对齐 # zfill() 右对齐 s = 'hello,Python' '''居中对齐''' print(s.center(20,'*')) print(s.center(20)) '''左对齐''' print(s.ljust(20,"*")) print(s.ljust(20)) '''右对齐''' print(s.rjust(20,'*')) print(s.rjust(20)) '''右对齐,使用0进行填充''' print(s.zfill(20)) print('-8910'.zfill(20))

判断字符串的方法
# isidentifier() 判断指定的字符串是不是合法的标识符 # isspace() 判断指定的字符串是否全部由空白字符串组成(回车,换行,水平制表符) # isalpha 判断指定的字符串是否全部由字母组成 # 判断字符串的方法 # isdecimal() 判断指定字符串是否全部由十进制的数组组成 # isnumeric() 判断指定的字符串是否全部由数字组成 # isalnum() 判断指定字符串是否全部由字母和数字组成 s = 'hello,python' print('---------isidentifier() 判断指定的字符串是不是合法的标识符----------------') print('1.',s.isidentifier()) #合法标识符是字母数字下划线 里面的','不是 false print('2.','hello'.isidentifier()) #true print('3.','张三'.isidentifier()) #true print('4.','张三_123'.isidentifier()) #true print('---------isspace() 判断指定的字符串是否全部由空白字符串组成---------------') print('5.','\t'.isspace()) #true print('--------- isalpha 判断指定的字符串是否全部由字母组成-----------') print('6.','abc'.isalpha()) #true print('7.','张三'.isalpha()) #true print('8.','张三1'.isalpha()) #false print('--------- isdecimal() 判断指定字符串是否全部由十进制的数组组成-----------') print('9.','123'.isdecimal()) #true print('10.','123四'.isdecimal()) #false print('--------- isnumeric() 判断指定的字符串是否全部由数字组成-----------') print('11.','123'.isnumeric()) #true print('12.','123四'.isnumeric()) #true print('--------- isalnum() 判断指定字符串是否全部由字母和数字组成-----------') print('13.','abc1'.isalnum()) #true print('14.','张三123'.isalnum()) #true print('15.','abc!'.isalnum()) #false print('-----------------字符串判断-----------------') s = 'hanxiaojungege!@#123' a = 0 b = 0 c = 0 for i in s: if i.isalpha(): a = a+1 elif i.isnumeric(): b = b+1 else: c = c+1 print('字母有:',a,'数字',b,'其它字符',c) 字符串的编码转换
s = '天涯共此时'
# 编码
print(s.encode(encoding='GBK')) #GBK这种编码中 一共中文占两个字符 b是二进制的意思
print(s.encode(encoding='UTF-8')) #在UTF-8这种编辑格式中,一共中文占三个字节

# 解码
# byte代表的是一共二进制数据(字节类型的数据)
byte=s.encode(encoding='GBK') #编码
print(byte.decode(encoding='GBK')) #解码

byte=s.encode(encoding='UTF-8') #编码
print(byte.decode(encoding='UTF-8')) #解码
总结 index(),rindex() 查询的方法 find(),rfind() 大小写转换 upper(),lower() 内容对齐 center() 字符 驻留的几种情况 字符串的劈分 split() 串的 驻留的优点 字符串判断 isdecimal() 驻留 强制驻留的方法 字符串的替换 replace() 字符串的合并 join() 常用方法 字符串的比较 >,<,>=,<=,==,!= 编码:print(s.encode(encoding='GBK')) print(s.encode(encoding='UTF-8')) 字符编码 解码:byte=s.encode(encoding='GBK') print(byte.decode(encoding='GBK')) (先编码才能解码)

id 查看元素内存地址

字典

字典的创建方式
'''使用{}创建字典'''
scores = {'张三':100,'小米':98,'小明':45}
print(scores)
print(type(scores))

'''第二种创建方式dict()'''
scores = dict(name = 'jack',age = 20)
print(scores)

'''空字典'''
d = {}
print(d)

字典的特点
# 字典中的所有元素都是一个key-value对,key不允许重复,value可以重复 # 字典中的元素是无序的 # 字典中的key必须是不可变对象 # 字典也可以根据需要动态地伸缩 # 字典会浪费较大的内存,是一种所以空间转时间的数据结构 d = {'name':'张三','name':'小米'} # key不允许重复 重复值会被覆盖 print(d) d = {'name':'小米','nikename':'小米'} # 字典中的value元素是可以重复的 print(d) lst = [10,20,30] lst.insert(2,100) print(lst)
字典生成式
# 内置函数zip() # 用于将可迭代的对象作用参数,将对象中对应的元打包成一个元组,然后返回由这些元组组成的列表 items = ['Fruits','Books','Others'] prices = ['小军',78,85] d = { items:prices for items ,prices in zip(items,prices) } print(d) 字典元素的遍历

scores = {'张三':100,'小米':98,'小明':45}
# 字典元素的遍历
for item in scores: print(item,scores[item],scores.get(item)) 字典元素的增_删_改操作
'''key判断''' scores = {'张三':100,'小米':98,'小明':45} print('张三' in scores) print('张三' not in scores) del scores['张三'] #删除指定的key—value对 #scores.clear() #清空字典的元素 print(scores) scores['小军']=98 #新增元素 print(scores) scores['小米']=100 #修改元素 print(scores)
元素中的获取 score s
= {'张三':100,'小米':98,'小明':45} '''第一次方式使用[]''' print(scores['张三']) #print(scores['小军']) KeyError: '小军' '''第二种方式,使用get()方法''' print(scores.get('张三')) print(scores.get('陈留')) #None print(scores.get('马奇',99)) #99是在查找'马奇'所对应的value不存在时,提供的一个默认值
获取字典的视图操作 scores = {'张三':100,'小米':98,'小明':45} # 获取所有的key keys = scores.keys() print(keys) print(type(keys)) print(list(keys)) #将所有的key组成的视图转成列表 # 获取所有的value value=scores.values() print(value) print(type(value)) print(list(value)) # 获取所有的key—value对 items=scores.items() print(items) print(list(items)) # 转换之后列表元素是由元组组成
知识总结 # 使用{}花括号 # 字典的创建 内置函数dict() # 字典生成式 # 字典名[key] # 获取value 字典名.get(key) # 常用操作 删除key-value对 del字典名[key] # 新增/修改 字典名[key]=value # in /not in

 元组

元组的创建方式
#
元组 # python内置的数据结构之一,是一个不可变序列 # 不可变序列与可变序列 # 不变可变序:字符串,元组 # 不可变序列:没有增,删,改的操作 # 可变序列:列表,字典 # 可变序列:可以对序列执行增,删,改操作,对象地址不发生更改 '''可变序列 列表,字典''' print('--------可变序列 列表,字典----------') lst = [10,20,30] print(id(lst)) lst.append(40) print(id(lst)) '''不可变序列,字符串,元组''' print('--------不可变序列,字符串,元组----------') s = 'hello' print(id(s)) s = s+'world' print(id(s)) print(s) # 元组的创建方式 小括号() print('--------元组的创建方式 第一种使用()----------') t = ('python','hello',52) print(t) print(type(t)) print('--------省略了小括号----------') t2 = 'python','world',98 print(t2) print(type(t2)) print('--------只有一个值的时候必须加上逗号----------') t3 = ('python',) #如果元组中只有一个元素 逗号不能省 print(type(t3)) print('--------第二种使用内置函数tuple()----------') t1 = tuple(('python','world',95)) print(t1) print(type(t1)) print('--------空列表的创建方式----------') print('--------空字典的创建方式----------') lst = [] lst1 = list() d = {} d2 = dict() print('--------空元组---------') t4 = () t5 = tuple() print('空列表',lst,lst1) print('空字典',d,d2) print('空元组',t4,t5)

元组的遍历
# 元组是可迭代对象,所以可以使用for……in进行遍历 '''元组的遍历''' t = ('python','world',98) '''第一种获取元组的方式,使用索引''' print(t[0]) print(t[1]) print(t[2]) # print(t[3]) IndexError: tuple index out of range '''遍历元组''' for item in t: print(item)
为什么要将元组设计成不可变序列
# 为什么要将元组设计成不可变序列 # 在多任务环境下,同时操作对象时不需要加锁 # 因此,在程序中尽量使用不可变序列 # 注意事项:元组中储存的是对象的引用 # a如果元组中对象本身是不可对象,则不能再引用其他对象 # b如果元组中的对象是可变对象,则可变对象的引用不允许改变,但数据可以改变 t = (10,[20,30],9) print(t) print(type(t)) print(t[0],type(t[0]),id(t[0])) print(t[1],type(t[1]),id(t[1])) print(t[2],type(t[2]),id(t[2])) print('----------尝试将t[1]修改为100---------') print(id(100)) # t[1] = 100 我们的元组是不允许修改元素的 '''由于[20,30]列表,而列表是可变序列,所以可以向列中添加元素,而列表的内存地址不要''' t[1].append(100) print(t,id(t[1]))

列表

为什么需要列表
a = 10 #变量存储的是一个对象的引用
lst = ['hello','world',98]
print(id(lst))
print(type(lst))
print(lst)

列表的创建
'''创建列表的第一种方式,使用[]'''
lst = ['helllo','world',98]

'''创建列表的第二种方式,使用内置函数list()'''

lst2 = list(['hello','world',98])
print(lst2)

# 列表的特点
#     列表元素按顺序有序排列
#     索引映射唯一个数据
#     列表可以存储重复数据
#     任意数据类型混存
#     根据需要动态分配和回收内存

列表的生成式
lst = [i*i for i in range(1,10)]
print(lst)

'''列表中的元素的值为2,4,6,8,10'''
lst2 = [i*2 for i in range(1,6)]
print(lst2)

列表元素添加操作
# append()向列表的末尾添加一个元素
lst = [10,20,30]
print('添加元素之前:',lst,id(lst))
lst.append(1000)
print('添加元素之后:',lst,id(lst))
# extend()在列表的末尾至少添加一个元素
lst2 = ['hello','world']
# lst.append(lst2) #将lst2做为一个元素添加到列表末尾
lst.extend(lst2)
# 向列表的末尾一次性添加多个元素
print(lst)

# 在任意位置上添加元素
lst.insert(5,90)
print(lst)

lst3 = [True,False,'heelo']
# 在任意的位置上添加N多个元素
lst[1:] = lst3
print(lst)

列表元素的排序
# 常见的两种方式
#     调用sort()方法,列表中的所有元素默认按照从大到小的顺序进行排序,可以指定reverse = True,进行降序排序
#     调用内置函数sored(),可以指定reverse = True,进行降序排序,是产生新的列表对象 原列表不发生改变
lst = [1,5,8,6,3,4]
print('排序前的列表',lst,id(lst))
#开始排序,调用列表对象的sort方法,升序排序
lst.sort()
print('排序后的列表',lst,id(lst))


#指定的关键字参数,将列表中的元素进行降序排序
lst.sort(reverse = True) #reverse=True 表示降序排序,reverse = False就是升序排序
print(lst)
lst.sort(reverse = False)
print(lst)

print('---------------使用内置函数sorted()对列表进行排序,将生产一个新的列表对象-------------')
lst = [1,5,8,6,3,4]
print('原列表',lst,id(lst))
# 开始排序
new_list = sorted(lst)
print(lst)
print(new_list)
# 指定关键字参数,实现列表元素的降序操作
desc_list = sorted(lst,reverse = True)
print(desc_list)
desc_list = sorted(lst,reverse = False)
print(desc_list)

lst = [10,20,30,40,50,60,30]
lst.remove(30) #从列表中移除一个元素,如果有重复元素只移动第一个元素
print(lst)
#lst.remove(100) ValueError: list.remove(x): x not in list

#pop()根据索引移除元素
lst.pop(1)
print(lst)
#lst.pop(5)IndexError: pop index out of range 如果不存在会抛出异常
lst.pop() #如果不指定参数(索引),会删除列表中的最后一个元素
print(lst)

print('--------------切片操作-删除至少一个元素,将产生一个新的列表对象--------')
new_list = lst[1:3]
print('原列表',lst)
print('切片后的列表',new_list)

'''不产生新的列表对象,而是删除列表中的内容'''
lst[1:3] = []
print(lst)

'''清除列表中所有的元素'''
lst.clear()
print(lst)

'''del语句将列表对象删除'''
del lst
# print(lst) NameError: name 'lst' is not defined 删除了没有定义

列表的判断
#判断
print('p' in 'python') #True
print('k' not in 'python') #True
lst = [10,20,'python','hello']
print(10 in lst) #True
print(100 in lst) #False
print(10 not in lst) #False

列表的遍历
# 列表元素的遍历
for item in lst:
    print(item)

获取列表中的指定元素
lst = ['hello','world',98,'world']
#获取索引为2的元素
print(lst[2])
# 获取索引为-3的元素
print(lst[-3])
# 获取索引为10的元素
print(lst[10]) #程序抛异常

列表中的切片操作
lst = [1,2,3,4,5,6,7,8,9]
# start = 1,stop = 6,step = 1
# print(lst[1:6:1])
print('原列表',id(lst))
lst2 = lst[1:6:1]
print('切片的片段:',lst2)
print(lst[1:6])#默认步长为1
print(lst[:5])
print(lst[1:])
print('------------step步长为负数的情况---------------')
print('原列表:',lst)
print(lst[::-1])
#start = 7,stop 省略 step = -1
print(lst[7::-1])
#start = 6,stop = 0 step = -2
print(lst[6:0:-2])

获取列表中位置的指定索引
lst = ['hello','world',98]
print(lst.index('hello')) #如果列表中有相同元素只返回列表中相同元素的第一个元素的索引
# print(lst.index('hell等等lo')) ValueError: 'helllo' is not in list

列表元素中的删除操作
lst = [10,20,30,40,50,60,30]
lst.remove(30) #从列表中移除一个元素,如果有重复元素只移动第一个元素
print(lst)
#lst.remove(100) ValueError: list.remove(x): x not in list

#pop()根据索引移除元素
lst.pop(1)
print(lst)
#lst.pop(5)IndexError: pop index out of range 如果不存在会抛出异常
lst.pop() #如果不指定参数(索引),会删除列表中的最后一个元素
print(lst)

print('--------------切片操作-删除至少一个元素,将产生一个新的列表对象--------')
new_list=lst[1:3]
print('原列表',lst)
print('切片后的列表',new_list)

'''不产生新的列表对象,而是删除列表中的内容'''
lst[1:3]=[]
print(lst)

'''清除列表中所有的元素'''
lst.clear()
print(lst)

'''del语句将列表对象删除'''
del lst
# print(lst) NameError: name 'lst' is not defined 删除了没有定义



集合

集合的概述与创建
# 集合
# python语言提供的内置数据结构
# 与列表,字典一样都属于可变类型的序列
# 集合是没有value的字典 # 集合的创建方式
'''第一种创建方式使用{}'''
s = {'python','hello',90,1,5,6} #集合中的元素不允许重复 会自动排序
print(s)

'''第二种创建方式使用内置函数set()'''
s1 = set(range(6))
print(s1,type(s1))

s2 = set([1,5,4,8,3,6,9])
print(s2,type(s2))

s3 = set((1,2,3,6,5,65)) #集合中的元素是无序的
print(s3,type(s3))

s4 = set('python')
print(s4,type(s4))

s5 = set({12,55,6,82,35})
print(s5,type(s5))

# 定义一个空集合
s6 = {} #dict字典类型 不可以直接使用
print(type(s6))

s7 = set()
print(type(s7))


集合的数学操作 # 集合的数学操作 # (1)交集 s1 = {10,20,30,40} s2 = {20,30,40,50,60} print(s1.intersection(s2)) print(s1 & s2) #intersection() 与 & 等价,交集操作 print(s1) print(s2) # (2)并集操作 print(s1.union(s2)) print(s1 | s2) #union() 与 | 等价,并集操作 print(s1) print(s2) #(3)差集操作 s1和s2比 s1里面s2没有的就是差集 print(s1.difference(s2)) print(s1-s2) #difference() 与 - 等价,差集操作 # (4)对称差集 s1和s2比 s1和s2都没有的就是对称差集 print(s1.symmetric_difference(s2)) print(s1 ^ s2) #symmetric_difference() 与 ^ 等价,对称差集操作 集合的相关操作
# 集合元素的判断操作 # in或not in # 集合元素的新增操作 # 调用add()方法,一次添加一个元素 # 调用update()方法至少添加一个元素 # 集合元素的删除操作 # 调用remover()方法,一次删除一个指定元素,如果指定的元素不存在抛出KeyError # 调用discard()方法,一次删除一个指定的元素,如果指定的元组不存在抛出异常 # 调用pop()方法,一次只删除一个任意元素 # 调用clear()方法,清空集合 s = {20,30,40,50,60,70} print('---------集合元素的判断操作----------') print(20 in s) #True print(11 in s) #False print(20 not in s) #False print(100 not in s) #True print('---------集合元素的新增操作----------') s.add(80) #add一次添加一个元素 print(s) s.update({200,44,500,822}) #至少添加一个元素 print(s) print('---------集合删除操作') s.remove(200) print(s) # s.remove(500) KeyError: 500 # s.discard(800) 删除元素不存在不会抛出异常 # print(s) s.pop() #删除任意元素 不能在括号里面指定参数不然会抛出异常 s.pop() print(s) s.clear() #清空集合 print(s)
集合间的关系
# 集合间的关系 # 两个集合是否相等 # 可以使用运算符==或!=进行判断 # 一个集合是否是另一个集合的子集 # 可以调用方法issubset进行判断 # B是A的子集 # 一个集合是否是另一个集合的超集 # 可以调用方法issuperset进行判断 # A是B的超集 # 两个集合是否没有交集 # 可以调用方法isdisjoint进行判断 # 两个集合是否相等(元素相同,就相同) s={10,20,30,40} s2={30,40,20,10,} print(s==s2) #True print(s!=s2) #False '''一个集合是否是另一个集合的子集''' s1={10,20,30,40,50,60} s2={10,20,30,40} s3={10,20,90} print(s2.issubset(s1)) #True print(s3.issubset(s1)) #False '''一个集合是否是另一个集合的超集''' print(s1.issuperset(s2)) #True print(s1.issuperset(s3)) #False '''两个集合是否含有交集''' print(s2.isdisjoint(s3)) #False 有交集为False s4={100,200,300} print(s2.isdisjoint(s4)) #True 没有交集True

集合生成式
# 列表生成式 lst = [i*i for i in range(10)] print(lst) # 集合生成式 s = {i*i for i in range(10)} print(s) # 元组生成式 应为元组里面的值不能被改变 所以输出<generator object <genexpr> at 0x0000020D3ED08990> # s = (i*i for i in range(6)) # print(s) # 列表,字典,元组,集合总结 # 数据结构 是否可变 是否重复 是否有序 定义符号 # 列表(list) 可变 可重复 有序 [] # 元组(tuple) 不可变 可重复 有序 () # 字典(dict) 可变 key不可重复 无序 {key:value} # value可重复 # 集合(set) 可变 不可重复 无序 {} # 使用()小括号 # 元 创建元组 内置函数tuple() # 组 元组的遍历 for……in # 不可变序列 # 使用{}花括号 # 创建集合 内置函数set() # 集合生成式 # 集合的遍历 for……in # add() # 集合 新增 # update() # # remover() # 删除 discard() # pop() # clear() # 可变序列
 

基础函数总结

i.isdigit() #判断是否是数字组成
i.isalpha() #判断是否有字母组成

append() #是追加一个值  在元组() 字典{} 中是无法使用的

range() #函数(起始位置 终止位置 步长)
range(1,11,2) #取奇数
range(0,11,2) #取偶数

len() #获取遍历对象的长度

max() #取最大值
min() #取最小值

import random #随机函数
print(random.randint(1,100))#从1~100中随机输出数字

sort() #从小到大
reverse() #从大到小

index() #获取元素下标

import time #时间日期模块
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

列表 list()    元组 tuple()     字典 dict()   集合 set() 
获取数据类型 type()   数据地址 id()   计算字符串长度 join()
AIIS值 chr()

异常处理机制pycharm的调试模式

traceback 模块打印异常信息
import
traceback try: print('-----------------') print(1/0) except: traceback.print_exc()
常见的异常类型
# ZeroDivsionError 除(或取模)零(所有的数据类型) # IndexError 序列中没有此索引(index) # KeyError 映射中没有这个键 # NameError 未声明/初始化对象(没有属性) # SyntaxError python语法错误 # ValueError 传入无效的参数 # (1)数学运算异常 #print(10/0) ZeroDivisionError lst=[11,22,33,44] # print(lst[4]) IndexError 索引从0开始 dic={'name':'张三','age':17} #print(dic['gender']) KeyError # print(num) NameError num没有被定义 # int a=20 SyntaxError 语法错误 # a=int('hello') ValueError 无效参数 异常处理机制(1)
# Bug的常见类型 # 被动掉坑问题的解决方案 # python提供了异常处理机制,可以在异常出血是即使捕获,然后内部‘消化’让程序继续运行 try: n1=int(input('请输入第一个整数:')) n2 = int(input('请输入第一个整数:')) result=n1/n2 print('结果为:',result) except ZeroDivisionError: print('异常处理机制 数字以0停止或没输入') except ValueError: print('异常处理机制 数字以字母停止') print('程序结束')
异常处理机制(2)
# try……except……else……finally结构 # finally快无论是否发生异常都会被执行,能常用来释放try块中申请的资源 try: a=int(input('请输入第一个整数:')) b=int(input('请输入第二个整数:')) result=a/b except BaseException as e: print('出错了',e) else: print('计算结果为:',result) finally: print('无论是否产生异常,总会被执行的代码') print('程序结束')

模块

什么是模块 模块化的编程好处
#
模块 # 模块的英文为Modules # 函数与模块的关系 # 一个模块中可以包含N多个函数 # 在Python中一个扩展名为.py的文件就是一个模块 # 使用模块的好处 # 方便其它程序和脚本的导入并使用 # 避免函数名和变量名冲突 # 提高代码的可维护性 # 提高代码可重用性 def fun(): pass def fun2(): pass class Student: native_place = '吉林' #类属性 def eat(self,name,age): self.name = name self.age = age @classmethod def cm(cls): pass @staticmethod def sm(): pass a = 10 b = 20 print(a+b) 模块的导入两种方式 import pageagel.module_A as ma #ma是pageagel.module_A 这个模块的别名 as是给这个模块取名为ma from pageagel import module_A
自定义模块的使用
# 自定义模块 # 新建一个.py文件,名称尽量不要与Python自带的标准模块名称相同 # 导入模块 # import 模块名称 [as 别名] # from 模块名称 import 函数/变量/类
自定义一个为mokuai1的模块名.py
def add(a,b): return a + b def div(a,b): return a / b
# 在 导入自定义mokuai1 中导入 mokuai1 并且使用 import mokuai1 #如果报错 右击模块 点击目录标记为 点击蓝色的Sources Root print(mokuai1.add(10,20)) #相加 print(mokuai1.div(2,8)) #想除 print("----------------------------") from mokuai1 import add print(add(2,5)) 模块导入的使用 import math #关于数学运算 print(id(math)) print(type(math)) print(math) print(math.pi) print("----------------------------------") print(dir(math)) print(math.pow(2,8)) #相当于2的8次方 print(math.ceil(8.0001)) #小数取整数 往大取 输出结果 9 print(math.floor(9.9999)) #小数取整数 往小取 输出结果 9 print("----------------------------------") from math import pi #指定调用math中的pi方法 print(pi) print(pow(4,2)) print("----------------------------------")
schedule模块循环调动
import schedule
import time
def job():
    print('gege!!!')
    print(time.localtime(time.time()))

schedule.every(3).seconds.do(job) #每三秒钟去执行以下job()函数
while True:
    schedule.run_pending() #去启动schedule
    time.sleep(1) #准备缓存的时间 没隔3秒去输出并且休眠1秒

函数

函数的创建和调用
# 创建函数
def calc(a,b):
    c = a+b
    return c
# 调用函数
result = calc(10,20)
print(result)

函数调用的参数传递
#     位置实参
#         根据形参对应的位置进行实参传递
#     关键字实参
#         根据形参名称进行实参传递

# 创建函数
def calc(a,b): #a b称为形式参数,简称形参,形参的位置是在函数的定义处
    c = a+b
    return c
# 调用函数
result = calc(10,20) #20 30称为实际参数的值,简称实 参,实参的位置是函数的调用处
print(result)

res = calc(b = 10,a = 20) # =左侧的变量的名称称为  关键字参数
print(res)

函数的参数传递内存分析
'''在函数调用过程中,进行参数的传递
如果是不可变对象,在函数体的修改不会影响实参的值 arg1的修改为100,不会影响到n1的值
如果是可变对象,在函数体的修改会影响到实参的值 arg2的修改,append(10),会影响到n2的值
'''

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

fun(10)
fun(10,30)
fun(30,405,50)
#     个数可变的关键字形参
#         定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参
#         使用**定义个数可变的关键字形参
#         结果为一个字典
def fun(**args):
    print(args)
fun(a = 10)
fun(a = 20,b = 30,c = 40)

print('hello','python','java')

'''def fun2(*args,*a):
    pass
    以上代码,程序会报错,个数可变的位置参数,只能是1个
def fun2(**args,**args):
    pass
    以上代码,程序会报错,个数可变的位置参数,只能是1个
    '''

def fun2(*args1,**args2):
    pass

'''def fun3(**args1,*arg2):
   pass
   在一个函数的定义过程中,既有个数可变的关键字形参,也有个数可变的位置形参
   要求,个数可变的位置形参,放在个数可变的关键字形参之前
   '''

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

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

#函数的调用
lst = [10,29,34,23,44,53,55]
print(fun(lst))

'''函数的返回值
(1)如果函数没有返回值【函数执行完毕之后,不需要给调用处提供数据】return可以省略不写
(2)函数的返回值,如果是1个,直接返回原值类型
(3)函数的返回值,如果是多个,返回的结果为元组'''

def fun1():
    print('hello')
    # return

fun1()

def fun2():
    return 'hello'

res = fun2()
print(res)

def fun3():
    return 'hello','world'
print(fun3())

'''函数在定义时是否需要返回值,视情况而定'''

函数变量的作用域 def fun(a,b): c = a+b #c 就称为局部变量,因为c是在函数体内进行定义的变量,a b为函数的形参,作用范围也是 #函数内部,相当于局部变量 print(c) # print(c) 报错 因为a,c超出了起作用的范围(超出了作用域) # print(a) name = '韩老师' print(name) def fun2(): print(name) #全局变量 #调用函数 fun2() def fun3(): global age #函数内部定义的变量,局部变量,局部变量使用了global声明,这个局部变量会变成全局变量 age = 17 print(age) fun3() print(age) 函数定义默认值参数 # 函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参 def fun(a,b = 10): #b称为默认值参数 print(a,b) #函数的调用 fun(100) fun(20,30) print('hello',end='\t') print('world') def fun1(a = 10): print(a) fun1()
递归函数
# 什么是递归函数 # 如果在一个函数的函数体内调用了该函数本身,这个函数就被称为递归函数 # 递归的组成部分 # 递归调用与递归终止条件 # 递归的调用过程 # 每递归用一次函数,都会在栈内存分配一个栈帧 # 每执行完一次函数,都会释放相应的空间 # 递归的优缺点 # 缺点:占用内存多,效率多 # 优点:思路和代码简单 def fac(n): if n == 1: return 1 else: res = n*fac(n-1) return res print(fac(6)) 斐波那契数列 def fid(n): if n == 1: return 1 elif n == 2: return 1 else: return fid(n-1)+fid(n-2) # 斐波那契数列第6位上的数字 print(fid(6))

面向对象

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

class Student: #没有定义类 会默认定义object类
    pass
stu = Student()
print(dir(stu)) #查看内置函数dir()对象属性
print(stu)  #<__main__.Student object at 0x00000133D9A0D828> 输出对象的内存地址

# __str__()方法
class Trudent:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return '我的名字是{0},今年{1}岁'.format(self.name,self.age)

Ag = Trudent('小※※',25)
print(Ag) #会默认调用__str__()方法
print(type(Ag))

多态
# 多态
#     多态就是“具有多种形态”,它指的是:即便不知道一个变量所引用的对象到底是什么类型,
#     依然可以通过这个变量调用方法,在运行过程中根据变量所引用对象的类型,动态决定调
#     用哪个对象的方法

class Xiaomi(object):
    def eat(self):
        print('小米品牌')
class Shouji(Xiaomi):
    def eat(self):
        print('红米K40pro')
class Diannao(Xiaomi):
    def eat(self):
        print('红米')

class Moren:
    def eat(self):
        print("性价比王")

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

# 开始调用函数
fun(Xiaomi())
fun(Shouji())
fun(Diannao())
print('---------------------------')
fun(Moren())

封装
# 面向对象的三大特征
#     封装:提高程序的安全性
#         将数据(属性)和行为(方法)包装到类对象中。在方法内部对属性进行操作,在
#         类对象的外部调用的方法。这样,无需关系方法内部的具体实现细节,从而隔离了复
#         杂度
class Car:
    def __init__(self,brand):
        self.brand = brand
    def start(self):
        print('汽车已启动……')

car = Car('红旗H9')
car.start()
print(car.brand)
#         在python中没有专门的修饰符用于属性的私有,如果该属性不希望在类对象外部被
#         访问,前边使用两个“_”
class Student: #类对象
    def __init__(self,name,age):
        self.name = name
        self.__age = age #年龄不希望在类的外婆被使用,所以加了两个_
    def show(self):
        print(self.name,self.__age)

stu = Student('小军',17)
stu.show()
# 在内的外部使用name与age
print(stu.name)
# print(stu.__age)当程序遇到两个_的时候计算机就知道 这个属性不希望在内的外部被使用
# 非要使用
print(dir(stu))
print(stu._Student__age) #在类的外部可以通过_Student__age进行访问

#     多态:提高程序的可扩展性和可维护性

继承
# 语法格式
#     class 子类类名(父类1,父类2):
#         pass
# 如果一个类没有继承任何类,则默认继承object
# python支持多继承
# 定义子类时,必须在其构造数中调用父类的构造函数

#     继承:提高代码的复用性
class Person(object): #Person继承object类
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def info(self):
        print(self.name,self.age)

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

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

stu=Stu dent('小米',20,'1001')
teacher = Teacher('李老师',20,1)

stu.info()
teacher.info()

# 多次继承
class A(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def fun(self):
        print(self.name,self.age)
class B(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def fun(self):
        print(self.name,self.age)
class C(A,B):
    def __init__(self,name,age):
        super().__init__(name,age)

name1 = B('小明',17)
name2 = C('小军',17)

name1.fun()
name2.fun()

_new_与_init_演示创建过程
class Person(object):

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

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

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

p1 = Person('张三',20)
print('p1这个Person类的实例对象的id为:{0}'.format(id(p1)))

方法重写
#     如果子类对继承自父类的某个属性的方法不满意,可以在子类中对其(方法体)进行重写编写
#     子类重写后的方法中可以通过super().xxx()调用父类中被重写的方法
class Person(object): #Person继承object类
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def info(self):
        print(self.name,self.age)

class Student(Person):
    def __init__(self,name,age,stu_no):
        super().__init__(name,age)
        self.stu_no = stu_no
    def info(self):
        super().info()
        print("成绩:",self.stu_no)

class Teacher(Person):
    def __init__(self,name,age,teachofyear):
        super().__init__(name,age)
        self.teachofyear = teachofyear
    def info(self):
        super().info()
        print("教龄:",self.teachofyear)

stu = Student('同学:小米','年龄:20',85)
teacher = Teacher('老师:米老师','年龄:25',12)

stu.info()
print('------------------------------')
teacher.info()

特殊属性
# 特殊属性 _dict_ 获取类对象或实例对象所绑定的所有属性和方法的字典

#          _len_ 通过重写_len_()方法,让内置函数len()的参数可以是自定义类型
#          _add_ 通过重写_add_()方法,可使用自定义对象具有“+”功能
# 特殊方法
#          _new_ 用于创建对象
#          _init_ 对创建的对象进行初始化

class A:
    pass
class B:
    pass
class C(A,B):
    def __init__(self,name,age):
        self.name=name
        self.age=age
class D(A):
    pass
# 创建C类的对象
x = C('Jack',20) #x是C类型的实例对象
print(x.__dict__) #实例对象的属性字典
print(C.__dict__)
print("--------------------------")
print(x.__class__) #<class '__main__.C'> 输出了对象所属的类
print(C.__bases__) #(<class '__main__.A'>, <class '__main__.B'>) C类的父类型的元素
print(C.__base__) #<class '__main__.A'> 输出类元素的第一个类
print(C.__mro__) #查看类的层次结构
print(A.__subclasses__()) #子类的列表

特殊方法
a = 20
b = 100
c = a + b #两个整数类型的对象的相加操作
d = a.__add__(b)

print(c)
print(d)

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

stu1 = Student('小明')
stu2 = Student('小红')

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

lst = [11,22,33,44]
print(len(lst)) #len 是内置函数 计算列表的长度
print(lst.__len__()) #_len_() 特殊方法对应内置函数 len()
print(len(stu1),len(stu2))

类的赋值与浅拷贝 深拷贝
a = 20
b = 100
c = a + b #两个整数类型的对象的相加操作
d = a.__add__(b)

print(c)
print(d)

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

stu1 = Student('小韩')
stu2 = Student('小军')

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

lst = [11,22,33,44]
print(len(lst)) #len 是内置函数 计算列表的长度
print(lst.__len__()) #_len_() 特殊方法对应内置函数 len()
print(len(stu1),len(stu2))

类和对象

类和对象的创建
#class Student:  #Student为类的名称(类名)由一个或多个单词组成,每个单词的首字母大写,其余小写
#    pass

#Python中一切皆对象Student是对象吗?内存有开空间吗?
#print(id(Student)) #1292798748888
#print(type(Student)) #<class 'type'>
#print(Student) <class '__main__.Student'>

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

    # 实例方法
    def eat(self):
        print('田小姐说早起的……')

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

    # 类方法
    @classmethod
    def cm(cls):
        print('我的类方法,因为我是使用了classmethod进行修饰')
#在类之外定义的称为函数,在类之内定义的称为方法

def drink():
    print('')

# 创建Student类的对象
stul=Student('张三',20)
# print(id(stul))
# print(type(stul))
# print(stul)
# print('-----------------------')
# print(id(Student)) #Student是类的名称
# print(type(Student))
# print(Student)
stul.eat() #对象吗.方法名()
print(stul.name)
print(stul.age)

print('------------------------------')
Student.eat(stul) #47行和42行代码功能相同,都是调用Student中的eat方法
                  #类名.方法名(类的对象)-->实际上就是方法定义处的self
Student.method()
Student.cm()
drink()

类属性 类方法 静态方法
# 类属性:类中方法外的变量称为类属性,被该类的所有的对象共享
# 类方法:使用@classmethod修饰的方法,使用类名直接访问的方法
# 静态方法:使用@staicmethod修饰的主法,使用类名直接访问的方法
class Student:
    native_pace='米姐姐'    #直接写在类里的变量,称为类属性
    def __init__(self,name,age):
        self.name = name #self.name 称为实体属性,进行了 一个赋值的操作 将局部变量的name赋值给实体属性
        self.age=age

    # 实例方法
    def eat(self):
        print('米姐姐说早起的鸟儿有虫吃')

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

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

# 类属性的使用方式
print(Student.native_pace)
stul=Student('小明',17)
stu2=Student('小红',19)
print(stul.native_pace)
print(stu2.native_pace)
Student.native_pace='哄老师'
print(stul.native_pace)
print(stu2.native_pace)
print('------------------类方法的使用方式---------------')
Student.cm()
print('------------------静态方法的使用方式---------------')
Student.method()

动态绑定属性和方法
class Student:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def eat(self):
        print(self.name+'在吃饭')

stu1 = Student('张三',20)
stu2 = Student('小军',17)
print(id(stu1))
print(id(stu2))

print('----------------为sru2动态绑定性别属性------------')
stu2.gender = ''
print(stu1.name,stu1.age)
print(stu2.name,stu2.age,stu2.gender)

print('-----------------------')
stu2.eat()
stu1.eat()

def show():
    print('定义在内之外的,称函数')
stu1.show = show #动态绑定方法
stu1.show()

# stu2.show() 因为stu2并没有绑定show方法

 编码格式 文件with 目录 等操作

编码格式
#encoding = gbk # 修改编码格式
print('你好,Python')
# 在python中默认的编码格式是UTF-8的格式
# 不同的编码格式决定占用磁盘大小内存
encoding='utf-8' #UTF-8可以改变

文件打开模式
# 文件的类型
#     按文件中数据的组织形式,文件分为以下两大类
#         文本文件:存储的是普通“字符”文本,默认为uniconder字符集,可以使用记事本程序打开
#         二进制文件:把数据内容用“字节”进行储存,无法用记事本打开,必须使用专用的软件打开

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

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

with
print(type(open('a.text','r')))
with open('a.text','r') as file:
    print(file.read()) #不用手动关闭 避免造成资源浪费

# with 文件的复制
with open('内涵 .png','rb') as src_file:
    with open('内涵3 .png','wb') as target_file:
        target_file.write(src_file.read())

os模块操作
# os模块操作目录相关函数
# getcwd()    返回当前的工作目录
# listdir(path)   返回指定路径下的文件和目录信息
# mkdir(path[,mode])  创建目录
# makedirs(path1/path2……[,mode])  创建多级目录
# rmdir(path) 删除目录
# removedirs(path1/path2……)   删除多级目录
# chdir(path) 将path设置为当前工作目录

os.path模块
# abspath(path)   用于获取文件或目录的绝对路径
# exists(path)    用于判断文件或目录是否存在,如果存在返回true否则返回false
# joib(path,name) 将目录与目录或文件名拼接起来
# splitext()  分离文件名和扩展名
# basename(path)  从一个目录中提取文件名
# dirname(path)   从一个路径中提供文件路径,不包括文件名
# isdir(path) 用于判断是否为路径

 

posted @ 2021-04-23 15:03  .笨蛋小韩  阅读(513)  评论(0)    收藏  举报