Python 基础

目录

1、Helloworld:

2、保留字:

3、字符编码:

4、转义字符:

5、变量:

6、input() 输入函数:

7、运算符:

7.1算数运算符

7.2、赋值运算符

7.3、比较运算符

7.4、布尔运算符

7.5、位运算

7.6、运算符的优先级

8、列表:

9、字典:

10、元组

11、集合:

12、字符串:

13、函数

14、异常处理机制:

15、对象:

15.1、面向对象的三大特征:

-封装:提高程序的安全性

-继承:提高代码复用性

15.2、特殊方法和特殊属性:

16、模块

16.1、os模块的常用函数:

17、文件的读写

17.1、语法规则:

17.2、常见的文件打开模式:

17.2.1、文本文件:

17.2.2、二进制文件:

18、学生信息管理系统:

18.1、需求分析:

18.2、需求实现:

18.3、项目打包:

案例:

-水仙花:

-九九乘法表:

-递归函数-阶乘:

-递归函数-斐波那契数列:

-推算时间:

-模拟客服自动回复:

-定义一个圆类,计算器面积和周长:

拓展:


1、Helloworld:

# 开发时间: 2022/10/11 14:09

# 可以输出数值

print(10)

print(10.1)

# 可以输出字符串

print('Helloworld')

print("Helloworld")

# 将字符串输出到文件中

# 注意:所指定的盘符需存在 、使用参数file=fp

fp = open('D:/text.txt', 'a+')

# a+表示如果文件不存在就创建,存在就在文件后追加

print('helloworld', file=fp)

fp.close()

2、保留字:

# 开发时间: 2022/10/11 14:44

import keyword

print(keyword.kwlist)

# 命名规则:

# -变量、函数、类、模块和其他对象的起名就叫标识符

# -规则:

#     字母、数字、下划线

#     不能以数字开头

#     不能是保留字

#     严格区分大小写

['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

3、字符编码:

# 开发时间: 2022/10/11 14:41

print(chr(0b100111001011000))

print(ord('乘'))

4、转义字符:

# 开发时间: 2022/10/11 14:21

# 转义字符

print('hello\nworld')

print('hello\tworld')

# /t有四个指标位

#源字符,不希望字符串中的转义字符起作用,就使用源字符,就是在字符串之前加上r或者R

print(r'hello\nworld')

#注意最后一个字符不可以是反斜杠,但可以是两个

#print(r'hrllo\nworld\')

print(r'hrllo\nworld\\')

5、变量:

# 开发时间: 2022/10/11 14:51

name='玛丽亚'

print(name)

print('标识:',id(name))

print('类型:',type(name))

print('值:',name)

#标识: 2519379989424

# 数据类型:

#     1、整数类型

#     英文为Integer,简写为int

#     整数的不同进制的表示方式:

#         -十进制:默认的进制

#         -二进制:以0b开头

#         -八进制:以0o开头

#         -十六进制:以0x开头

#      2、浮点类型

#       浮点类型由整数部分和小数部分组成

#       浮点数存储不精确性

#       使用浮点数进行计算时,可能会出现小数点位数不确定的情况

n1=1.1

n2=2.2

n3=2.1

print(n1+n3) #3.2

print(n1+n2) #3.3000000000000003

from decimal import Decimal

print(Decimal('1.1')+Decimal('2.2'))#3.3

#       3、布尔类型

#       用来表示真假true/flase

#       true->1

#       false->0

#        4、字符串

#        字符串又被称为不可变的字符序列

#        可以使用单引号、双引号、三引号来定义

#        单引号和双引号定义的字符串必须在同一行

#        三引号定义的字符串可以分布在连续的多行

数据类型转换:

 

print('---------------int转string-------------------')

age=18

print(type(name),type(age)) #说明两者类型不一样

#print('我叫'+name+'今年'+age+'岁')

#TypeError: can only concatenate str (not "int") to str

print('我叫'+name+'今年'+str(age)+'岁')

print('---------------str()将其他类型转换成str类型-------------------')

a=10

b=192.8

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='123'

f1=98.3

s2='76.77'

f2=True

s3='hello'

print(type(s1),type(f1),type(s2),type(f2),type(s3))

print(int(s1),type(int(s1))) #123

print(int(f1),type(int(f1))) #98

# print(int(s2),type(int(s2)))   将小数字符串转换为int 报错

# print(int(f2),type(int(f2)))   布尔类型转换为int 报错

# print(int(s3),type(int(s3)))   字符串转为int 报错 字符串为非数字字符串

print('----------------float()函数,将其他类型转为float类型--------------')

s1='123.23'

f1='98'

s2=76

f2=True

s3='hello'

print(type(s1),type(f1),type(s2),type(f2),type(s3))

# print(float(s1),type(int(s1)))

print(float(f1),type(int(f1))) #98.0

print(float(s2),type(int(s2))) #76.0

print(float(f2),type(int(f2))) #1.0

# print(float(s3),type(int(s3)))

6、input() 输入函数:

使用input()函数,默认是字符类型,因此我们需要做类型转换

a=input("输入一个加数:")

b=input("输入另一个加数数:")

print(type(a),type(b))

print(a+b)

 

类型转换

print(int(a)+int(b))

 

7、运算符:

7.1算数运算符

 

7.2、赋值运算符

-执行顺序:从右向左

-支持链式赋值:a=b=c=20

-支持参数赋值:+=、-=、/=、//=、*=、%=

-支持系列解包赋值:a,b,c=10,20,30

7.3、比较运算符

<、>、==、<=、>=

==:对象value的比较

is、is not :对象的id的比较

7.4、布尔运算符

and、or、not、in、not in

7.5、位运算

位与&:对应数位都是1,结果数位才是1,否则为0

位或|:对应数位都是0,结果才是0,否则为1

左移位运算<<:高位溢出舍弃,低位补0

右移位运算>>:低位溢出舍弃,高位补0

7.6、运算符的优先级

算数>位运算>比较运算>布尔运算>赋值

8、列表:

-列表元素的增加操作

1、append():在列表的末尾添加一个元素

2、extend():在列表的末尾至少添加一个元素

3、insert():在列表的任意位置添加一个元素

4、切片:在列表的任意位置添加至少一个元素

# 开发时间: 2022/10/12 17:54

print('------------append-------------')

lst=[10,20,30]

print('添加元素之前\n',lst,id(str))

lst.append(40)

print('添加元素之后\n',lst,id(str))

# 添加元素之前

#  [10, 20, 30] 140736887016544

# 添加元素之后

#  [10, 20, 30, 40] 140736887016544

print('--------------extend------------')

lst2=['hello','world']

# lst.append(lst2) # 将lst2作为一个元素添加到列表lst的末尾

# print(lst)    #[10, 20, 30, 40, ['hello', 'world']]

lst.extend(lst2)

print(lst) #[10, 20, 30, 40, 'hello', 'world']

print('--------------insert-------------')

lst.insert(1,100)

print(lst)

print('-------------切片-----------------')

lst3=[True,False]

lst[1:]=lst3

print(lst)

# [10, 100, 20, 30, 40, 'hello', 'world'] --->[10, 100, 20, 30, 40, 'hello', 'world']

-列表元素的删除操作

1、remove():一次删除一个元素、重复元素只删除第一个、元素不存在抛出ValueError

2、pop():删除一个指定索引位置上的元素、指定索引不存在抛出IndexError、不指定索引就删除列表中最后一个元素

3、切片:一次至少删除一个元素

4、clear():清空列表

5、del:删除列表

# 开发时间: 2022/10/13 9:44

# remove

lst=[1,5,2,3,4,5]

lst.remove(1) # [5, 2, 3, 4, 5]

lst.remove(5) # [1, 2, 3, 4, 5]

print(lst)

# pop

lst1=[1,2,3,4,5]

lst1.pop(1) # [1, 3, 4, 5]

lst1.pop()  # [1, 2, 3, 4]

print(lst1)

# 切片

lst2=[1,2,3,4,5]

lst2_after=lst2[2:]

print(lst2_after) # [3, 4, 5]

# clear

lst3=[1,2,3,4,5]

lst3.clear()

print(lst3)

# del

lst4=[1,2,3,4,5]

del lst4

print(lst4) # NameError: name 'lst4' is not defined. Did you mean: 'lst'? --找不到了

-列表元素的排序操作

常见的两种方式:

调用sort()方法,列中的所有元素默认按照从小到大的顺序进行排序,可以指定reverse=True,进行降序排序

调用内置函数sorted(),可以指定reverse=True,进行降序排序,原列表不发生改变

# 开发时间: 2022/10/13 10:32

lst=[4,2,3,1]

lst.sort()

print(lst) # [1, 2, 3, 4]

lst.sort(reverse=True)

print(lst) # [4, 3, 2, 1]

lst=[4,2,3,1]

lst_after=sorted(lst)

print(lst_after) # [1, 2, 3, 4]

lst_desc=sorted(lst,reverse=True)

print(lst_desc) # [4, 3, 2, 1]

-列表生成式

# 开发时间: 2022/10/13 10:55

lst=[i for i in range(1,10) ] # [1, 2, 3, 4, 5, 6, 7, 8, 9]

print(lst)

lst1=[i*i for i in range(1,10)] # [1, 4, 9, 16, 25, 36, 49, 64, 81]

print(lst1)

9、字典:

-字典的创建:

·最常用的方式:使用花括号

scores={‘张三‘:100,’李四’:45}

·使用内置函数dict()

dict(name=‘jack’,age=20)

-字典元素查找:

# 开发时间: 2022/10/13 14:36

score={'张三':90,'李四':80}

print(score['张三'])

# print(score['陈六']) #keyError:‘陈六’

print(score.get('李四'))

# print(score['陈六']) #None

print(score.get('麻七',99)) # 99是在查找麻七所对的value不存在时,提供一个默认值

-字典元素的判断、删除、修改、添加:

# 开发时间: 2022/10/13 14:46

# key的判断

score={'张三':90,'李四':80,'王五':70}

print('张三' in score) # True

print('张三' not in score) # false

# 删除字典元素

del score['张三']

print(score) # {'李四': 80, '王五': 70}

score.clear()

print(score) #清空

# 添加元素

score['陈六']=60

print(score)

# 修改元素

score['陈六']=30

print(score)

-获取字典视图的三个方法:

-keys():获取字典中所有的key

-values():获取字典中所有的value

-items():获取字典中所有的key-valuse对

# 开发时间: 2022/10/13 14:57

score={'张三':90,'李四':80,'王五':70}

keys = score.keys()

print(keys)

print(type(keys))

print(list(keys))

# dict_keys(['张三', '李四', '王五'])

# <class 'dict_keys'>

# ['张三', '李四', '王五']

values = score.values()

print(values)

print(type(values))

print(list(values))

# dict_values([90, 80, 70])

# <class 'dict_values'>

# [90, 80, 70]

items = score.items()

print(items)

print(type(items))

print(list(items))

# dict_items([('张三', 90), ('李四', 80), ('王五', 70)])

# <class 'dict_items'>

# [('张三', 90), ('李四', 80), ('王五', 70)]

# 转换之后的队列元素时由元组组成

-字典的特点:

·字典中所有元素都是一个key-value对,key不允许重复,value可以重复

·字典中的元素的无序的

·字典 中的key必须是不可变现象

·字典也可以根据需要动态的伸缩

·字典会浪费较大的内存,是一种使用空间换时间的数据结构

-字典生成式:

·内置函数zip()

用于将可迭代的对象作为参数,将对象中对应的元素打包成一个元组,然后返回由这些元组组成的列表

 

# 开发时间: 2022/10/13 15:53

items=['Fruits','Books','Others']

prices=[96,78,85]

d={item:price for item,price in zip(items,prices)}

print(d)

10、元组

-元组的创建:

# 开发时间: 2022/10/13 16:17

# 方式1:

t=('Python','Hello',90)

print(t)

print(type(t))

# 只包含一个元组的元素需要使用小括号和逗号

t0=(12,)

print(t0)

print(type(t0))

# 方式2:

t1='Python','Hello',90

print(t1)

print(type(t1))

# 方式3:

t2=tuple(('Python','Hello',90))

print(t2)

print(type(t2))

# ('Python', 'Hello', 90)

# <class 'tuple'>

# (12,)

# <class 'tuple'>

# ('Python', 'Hello', 90)

# <class 'tuple'>

# ('Python', 'Hello', 90)

# <class 'tuple'>

#遍历

for item in t:

    print(item)

11、集合:

# 开发时间: 2022/10/13 16:43

'''集合的创建'''

t={1,2,3,4,5}

print(t,type(t)) # {1, 2, 3, 4, 5} <class 'set'>

t1=set((1,2,3,4,5))

print(t1,type(t1)) # {1, 2, 3, 4, 5} <class 'set'>

# 集合的特性:集合中的元素不能重复

t2={1,2,2,3,3,4,4}

print(t2) # {1, 2, 3, 4}

'''集合中元素的判断'''

print(1 in t) # True

'''创建空集合'''

# s={} 若直接使用花括号,其类型为dict

s={()}

print(type(s))

s1=set()

print(type(s1))

'''向集合中添加元素'''

s.add(1)

print(s) # {1, ()}

s1.add(1)

print(s1)# {1}

# add一次添加一个元素

s.clear()

s.update((1,2,3))

s.update([4,5,6])

s.update({7,8,9})

print(s,type(s))

# {1, 2, 3, 4, 5, 6, 7, 8, 9} <class 'set'>

# update 一次至少添加一个元素

'''集合元素的删除操作'''

s.remove(1) # 一次删除一个指定元素,如果指定的元素不存在抛出KeyError

print(s)

s.pop() # 一次只删除一个任意元素

print(s)

s.discard(3) # 一次删除一个指定元素,如果指定的元素不存在不抛出异常

print(s)

s.clear() # 清空集合

print(s)

-集合间的关系:

-两个集合是否相等

-可以使用运算符==或!=进行判断

-一个集合是否是另一个集合的子集

-可以使用方法issubset()进行判断

-判断B是否是A的子集

print(B.issubset(A))

-一个集合是否是另一个集合的超集

-可以使用方法issupset()进行判断

-判断A是否B的超集

print(A.issupset(B))

-两个集合是否没有交集

-可以调用方法isdisjoint进行判断

-判断A和B是否没有交集

print(A.isdisjoint(B))

返回True表示没有交集

返回False表示有交集

-集合的数据操作:

 

# 开发时间: 2022/10/13 17:15

'''集合的数据操作'''

'''(1)交集'''

s1={1,2,3,4,5,6,7,8,9}

s2={4,5,6,7,8,9}

print(s1.intersection(s2))

# {4, 5, 6, 7, 8, 9}

print(s1 & s2)

# {4, 5, 6, 7, 8, 9}

# &和intersection类似,为交集操作

'''(2)并集操作'''

print(s1.union(s2)) # {1, 2, 3, 4, 5, 6, 7, 8, 9}

print(s1 | s2) # {1, 2, 3, 4, 5, 6, 7, 8, 9}

# |和union类似,为并集操作

'''(3)差集操作'''

print(s1.difference(s2)) # {1, 2, 3}

print(s1-s2) # {1, 2, 3}

# -和difference类似,为差集操作

'''(4)对称差集'''

print(s1.symmetric_difference(s2)) # {1, 2, 3}

print(s1 ^ s2) # {1, 2, 3}

# ^和symmetric_difference类似,为对称差集操作

 

12、字符串:

字符串的驻留机制:

字符串驻留机制的优缺点:

当需要值相同的字符串时,可以直接从字符串池中拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是会比较影响性能的

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

-字符串的查询操作方法:

功能

方法名称

作用

查询方法

index()

查找子串substr第一次出现的位置,如果查找的子串不存在时,则抛出ValueError

rindex()

查找子串substr最后一次出现的位置,如果查找的子串不存在时,则抛出ValueError

find()

查找子串substr第一次出现的位置,如果查找的子串不存在时,则返回-1

rfind()

查找子串substr最后一次出现的位置,如果查找的子串不存在时,则返回-1

-字符串的大小写转换操作的方法:

功能

方法名称

作用

大小写转换

upper()

把字符串中所有字符都转换成大写字母

lower()

把字符串中所有字符都转换成小写字母

swapcase()

把字符串中所有大写字母转成小写字母,把所有小写字母都转成大写字母

capitalize()

把第一个字符转换成大写,把其余字符转换成小写

title()

把每个单词的第一个字符转成大写,把每个单词的剩余字符转换成小写

-字符串内容对齐操作的方法:

功能

方法名称

作用

字符串对齐

center()

居中对其,第一个参数指定宽度,第二个参数指定填充符号,第二个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符串

ljust()

左对齐,第一个参数指定宽度,第二个参数指定填充符号,第二个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符串

rjust()

右对齐,第一个参数指定宽度,第二个参数指定填充符号,第二个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符串

zfill()

右对齐,左边用0填充,该方法只接收一个参数,用于指定字符串的宽度,如果指定的宽度小于等于字符串的长度,返回字符串本身

# 开发时间: 2022/10/14 10:40

s='Hello'

print(s.center(20))

print(s.ljust(20,'*'))

print(s.rjust(20,'*'))

print(s.zfill(20))

#        Hello

# Hello***************

# ***************Hello

# 000000000000000Hello

-字符串的劈分:

功能

方法名称

作用

字符串的劈分

split()

从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表

以通过参数sep指定劈分字符串是劈分符

通过参数maxsplit指定劈分字符串时的最大劈分次数,再经过最大次劈分之后,剩余的子串会单独作为一部分

rsplit()

从字符串的右边开始劈分,默认的劈分字符时空格字符串,返回的值都是一个列表

以通过参数sep知道你劈分字符串是劈分符

通过参数maxsplit指定劈分字符串时的最大劈分次数,再经过最大劈分之后,剩余的子串会单独作为一部分

例如:

s='hello world Python'

lst=s.split()

print(lst) #输出的结果为列表形式:切分后的结果类型为列表

#['hello','world','Python']

# 开发时间: 2022/10/14 11:08

s='hello|world|Python'

lst=s.split(sep='|',maxsplit=1)

print(lst)

# ['hello', 'world|Python']

# maxsplit参数代表切分次数,sep参数指定其分隔符

-判断字符串操作的方法:

功能

方法名称

作用

判断字符串的方法

isidentifier()

判断指定的字符串是不是合法的标识符

isspace()

判断指定的字符串是否全部由空白字符组成(回车、换行、水平指标符)

isalpha()

判断指定的字符串是否全部由字母组成

isdecimal()

判断指定字符串是否全部由十进制的数组成

isnumeric()

判断指定的字符串是否全部由数字组成

isalnum()

判断指定字符串是否全部由字母和数字组成

-字符串操作的其他方法:

功能

方法名称

作用

字符串替换

replace()

第一个参数指定被替换的子串,第二个参数指定替换子串的字符串,该方法返回替换后得到的字符串,替换前的字符串不发生变化,调用该方法时可以通过第三个参数来指定最大替换次数

字符串合并

join()

将列表或元组中的字符合并成一个字符串

例如(替换):

s='hello Python Python Python'

print(s.replace('Python','Java'),2)

#输出结果为:hello Java Java Python

例如(合并):

lst=['hello','python','java']

print('|'.join(lst))

print(''.join(lst))

#输出结果为:hello|python|java

hellopythonjava

-格式化字符串:

格式化字符串有两种方式

1、%作为占位符

例如:'我的名字叫:%s,今年%d岁了' % (name,age)

2、{}作为占位符

例如:'我的名字叫{0},今年{1}岁了'.format(name,age)

3、{变量}

例如:'我的名字叫{name},今年{age}岁了'

-字符串的编码与解码:

# 开发时间: 2022/10/14 15:00

s='天涯共此时'

# 编码

print(s.encode(encoding='GBK')) # 在GBK这种编码格式中,一个中文占两个字节

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')) # 解码

13、函数

函数的返回值:

【1】、如果函数没有返回值【函数执行完毕后,不需要给调用处提供数据】return可以省略不写

【2】、函数的返回值,如果是一个,直接返回类型

【3】、函数的返回值,如果是多个,返回的结果为元组

函数的参数定义:

(1)、个数可变的位置参数

【1】、定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数

【2】、使用*定义个数可变的位置形参

【3】、结果为一个元组

def fun(*args):

    print(args)

fun(10)

fun(10,20,30)

(10,)

(10, 20, 30)

(2)、个数可变的关键字形参

【1】、定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参

【2】、使用**定义个数可变的关键字形参

【3】、结果为一个字典

def fun1(**kwargs):

    print(kwargs)

fun1(a=10)

fun1(a=10,b=20,c=30)

{'a': 10}

{'a': 10, 'b': 20, 'c': 30}

14、异常处理机制:

·try……except……else……finally结构:

例如:

try:

n1=int(input('pleace input an number:'))

n2=int(input('pleace input anther number'))

result=n1/n2

except BaseException as e:

print('find error')

finally:

print('it's always print whatever yes or no')

print('ending')

常见的异常类型:

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

IndexError:序列中没有次索引(index)

KeyError:映射中没有这个键

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

ValueError:传入无效的参数

traceback模块:

·使用traceback模块打印异常信息

 import traceback

try:

print('-----------')

num=10

except:

traceback.print_exc()

 

15、对象:

# 开发时间: 2022/10/17 11:12

class Student:

    native_pace = '吉林'

    def __init__(self, name, age):

        self.name = name

        self.age = age

    # 对象方法

    def eat(self):

        print('在吃饭ing')

    # 定义静态方法

    @staticmethod

    def method():

        print('我是使用了@staticmethod修饰,所以我是静态方法')

    # 定义类方法

    @classmethod

    def cm(cls):

        print('我使用@classmethod来修饰,所以我是类方法')

def drink():

    print('我在喝水')

stu1 = Student('张三',20)

stu1.eat()

print(stu1.name)

print(stu1.age)

print('---------------------')

Student.eat(stu1) # 此行与二十九行的功能都是相同的,都是在调用eat()方法

# 类名.方法名(类的对象)-->实际上就是方法定义处的self

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

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

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

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

print(Student.native_place) # 访问类属性

Student.cm() #调用类方法

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

# 绑定方法

def show():

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

stu1.show = show

stu1.show()

15.1、面向对象的三大特征:

-封装:提高程序的安全性

-将数据(属性)和行为(方法)包装到类对象中。在方法内部对属性进行操作,在类对象的外部调用方法。这样,无需关心方法内部的具体实现细节,从而隔离了复杂度

-在Python中没有专门的修饰符用于属性的私有,如果该属性不希望再类对象外部被访问,前边使用两个“_”

# 属性私有化

class People:

    def __init__(self,name,age):

        self.name=name

        self.__age=age

    def look(self):

        print(self.name,self.__age)

peo=People('张三',20)

peo.look()

print(peo.name)

# 但是仍可以访问

print(peo._People__age)

-继承:提高代码复用性

-语法格式:

class  子类类名(父类1,父类2……)

pass

-如果一个类没有继承任何类,则默认继承object

-Python支持多继承

-定义子类时,必须在其构造函数中调用父类的构造函数

例如:Person有两个子类Student,Teacher

# 开发时间: 2022/10/17 14:48

class Person(object):

    def __init__(self,name,age):

        self.name=name

        self.age=age

    def info(self):

        print('姓名:{0},年龄:{1}'.format(self.name,self.age))

class Student(Person):

    def __init__(self,name,age,score):

        super().__init__(name,age)

        self.score=score

class Teacher(Person):

    def __init__(self,name,age,teachyear):

        super().__init__(name,age)

        self.teachyear=teachyear

stu=Student('Jack',20,80)

tea=Teacher('Lihua',45,10)

stu.info()

tea.info()

-方法重写

-如果子类对继承父类的某个属性或方法不满意,可以在子类中对其(方法体)进行重新编写

-子类重写后的方法中可以通过super().xxx()调用父类中被重写的方法

class Student(Person):

    def __init__(self,name,age,score):

        super().__init__(name,age)

        self.score=score

    def info(self):

        super().info() # 重写父类中的方法

        print('成绩:{0}'.format(self.score))

-object类:

-object类是所有类的父类,因此所有类都有object类的属性和方法。

-内置函数dir()可以查看指定对象所有属性

-object有一个_str_()方法,用于返回一个对于“对象的描述”,对应于内置函数str()经常用于print()方法,帮我们查看对象的信息,所以我们经常会对_str_()进行重写

# 开发时间: 2022/10/17 15:19

class Student:

    def __init__(self,name,age):

        self.name=name

        self.age=age

    def __str__(self): # 重写方法,该方法原本是对对象的描述

        return '我的名字是{0},今年{1}岁了'.format(self.name,self.age)

stu=Student('张三',20)

print(dir(stu))

print(stu)

print(object)

 

-多态:提高程序的可拓展性和可维护性

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

# 开发时间: 2022/10/17 15:33

class Animal:

    def eat(self):

        print('吃')

class Dog(Animal): #继承

    def eat(self): #方法重写

        print('狗吃骨头')

class Cat(Animal):

    def eat(self):

        print('猫吃鱼')

class Person(Animal):

    def eat(self):

        print('人吃五谷杂粮')

def fun(obj):

    obj.eat()

fun(Dog())

fun(Cat())

fun(Person())

-动态语言和静态语言:

-静态语言实现多态的三个必要条件

-继承

-方法重写

-父类引用指向子类对象

-动态语言的多态崇尚“鸭子类型”当看到一只鸟走起来像鸭子、游泳起来也像鸭子,那么这只鸟就可以被称为鸭子。在鸭子类型中,不需要关心对象是什么类型,到底是不是鸭子,只关心对象的行为。

15.2、特殊方法和特殊属性:

名称

描述

特殊属性

__dict__

获得类对象或实例对象所绑定的所有属性和方法

特殊方法

__len__()

通过重写__len__()方法,让内置函数len()的参数可以是自定义类型

__add__()

用过重写__add__()方法,可使用自定义对象具有“+”功能

__new__()

用于创建对象

__init__()

对创建的对象进行初始化

__new__与__init__演示创建对象的过程:

# 开发时间: 2022/10/17 17:33

class Person(object):

    def __new__(cls, *args, **kwargs):

        print('__new__被调用执行了,cls的id值未{0}'.format(id(cls)))

        obj=super().__new__(cls)

        print('创建的对象的id为{0}'.format(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)))

#创建Person类的实例对象

p1=Person('张三',20)

print('P1这个Person类的实例对象的id;{0}'.format(id(p1)))

运行结果为:

 

类的浅拷贝和深拷贝:

-变量的赋值操作:

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

-浅拷贝:

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

-深拷贝:

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

import copy

print(disk)

computer2=copy.copy(computer)

print(computer,computer.cpu,computer.disk)

print(computer2,computer2.cpu,computer2.disk)

16、模块

模块名

描述

sys

与Python解释器及其环境作相关的标准库

time

提供与时间相关的各种函数的标准库

os

提供了访问操作系统服务功能的标准库

calendar

提供与日期相关的各种函数的标准库

urllib

用于读取来自网上(服务器)的数据标准库

json

用于使用JSON序列化和反序列化对象

re

用于在字符串中执行正则表达式匹配和替换

math

提供标准算术计算函数的标准库

decimal

用于进行精确控制运算精度、有效数位和四舍五入操作的十进制运算

logging

提供了灵活的记录事件、错误、警告和调试信息等日志信息的功能

16.1、os模块的常用函数:

# 开发时间: 2022/10/24 15:23

import os

os.system('notepad.exe') #打开系统记事本功能

os.system('calc.exe') #打开系统的计算器

#直接调用可执行文件

os.startfile('C:\\Program Files\\Tencent\QQ\Bin\\qq.exe')

os模块操作目录的相关函数:

函数

说明

getcwd()

返回当前的工作目录

listdir(path)

返回指定路径下的文件和目录信息

mkdir(path[,mode])

创建目录

makedirs(path1/path2...[,mode])

创建多级目录

rmdir

删除目录

removedirs(path1/path2...)

删除多级目录

chdir(path)

将path设置为当前工作目录

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

函数

说明

abspath(path)

用于获取文件或目录的绝对路径

exists(path)

用于判断文件或目录是否存在,如果存在返回true,否则返回false

join(path,name)

将目录与目录或者文件名拼接起来

splitext()

分离文件名和拓展名

basename(path)

从一个目录中提取文件名

dirname(path)

从一个路径中提取文件路径,不包括文件名

isdir(path)

用于判断是否为路径

#调用os.path

import os.path

import os.path

print(os.path.abspath())

print(os.path.exists())

print(os.path.join())

print(os.path.splitext())

17、文件的读写

17.1、语法规则:

 

file=open('a.txt','r')

print(file.readlines())

file.close()

17.2、常见的文件打开模式:

按文件中数据的组织形式,文件分为以下两大类:

17.2.1、文本文件:

存储的是普通“字符”文本,默认位unicode字符集,可以使用记事本程序打开

17.2.2、二进制文件:

把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,举例:mp3音频文件、jpj图片、。doc文档等

打开模式

描述

r

以只读模式打开文件,文件的指针将会放在文件的开头

w

以只写模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原有的内容,文件指针在文件的开头

a

以追加模式打开文件,如果文件不存在则创建,文件指针在文件开头,如果文件存在,则文件末尾追加内容,文件指针在原文件末尾

b

以二进制方式打开文件,不能单独使用,需要与其他模式一起使用,如:rb,或者wb

+

以读写方式打开文件,不能单独使用,需要与其他模式一起使用,a+

方法名

说明

read([size])

从文件中读取size个字节或字符的内容返回,若省略[size],则读取到文件末尾,即一次读取文件的所有内容

readline()

从文本文件中读取一行内容

readines()

把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回

write(str)

将字符串写入文件

writelines(s_list)

将字符串列表s_list写入文本文件,不添加换行内容

seek(offset[,whence])

把文件指针移动到新的位置,offset表示相对于whence的位置:

offset:为正往结束方向移动,为负往方向移动

whence不同的值表示不同含义:

0:从文件头开始计算(默认值)

1:从当前位置开始计算

2:从文件尾部开始计算

tell()

返回指针当前的位置

flush()

把缓冲区的内容写入文件,但不关闭文件

close()

把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源

f=open('a.txt','a') //a为追加模式

lst=['hello\n','python\n','world\n']

f.writelines(lst)

f.close()

17.2.3、with语句:

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

 

# 开发时间: 2022/10/24 14:43

class Mycontent(object):

    def __enter__(self):

        print('enter方法被调用了')

        return self

    def __exit__(self, exc_type, exc_val, exc_tb):

        print('exit方法被调用执行力')

    def show(self):

        print('show方法被调用执行了')

with Mycontent() as file:

    file.show()

 

可用来实现文件的复制

with open('a.png','rb') as src_file:

    with open('b.png','wb') as target_file:

        target_file.write(src_file.read())

18、学生信息管理系统:

18.1、需求分析:

学生管理系统应该具备的功能:

-添加学生及成绩信息

-将学生信息保存在文件中

-修改和删除学生信息

-查询学生信息

-根据学生成绩进行排序

-统计学生的总分

 

 

 

18.2、需求实现:

# 开发时间: 2022/10/24 16:59

import os.path

import os

filename='student.txt'

def main():

    while True:

        menum()

        choice=int(input('请选择:'))

        if choice in [1,2,3,4,5,6,7]:

            if choice==0:

                answer=input('您确定要退出系统吗?y/n')

                if answer=='y' or answer=='Y':

                    print('谢谢您的使用!!!')

                    break

                else:

                    continue

            elif choice==1:

                insert()

            elif choice==2:

                search()

            elif choice==3:

                delete()

            elif choice==4:

                modify()

            elif choice==5:

                sort()

            elif choice==6:

                total()

            elif choice==7:

                show()

def menum():

    print('======================学生信息管理系统=====================')

    print('-------------------------功能菜单-------------------------')

    print('\t\t\t\t\t\t1、录入学生信息')

    print('\t\t\t\t\t\t2、查找学生信息')

    print('\t\t\t\t\t\t3、删除学生信息')

    print('\t\t\t\t\t\t4、修改学生信息')

    print('\t\t\t\t\t\t5、排序')

    print('\t\t\t\t\t\t6、统计学生总人数')

    print('\t\t\t\t\t\t7、显示所有学生信息')

    print('\t\t\t\t\t\t0、退出')

    print('---------------------------------------------------------')

def insert():

    student_list=[]

    while True:

        id=input('请输入ID:')

        if not id:

            break

        name=input('请输入姓名:')

        if not name:

            break

        try:

            english=int(input('请输入英语成绩:'))

            python=int(input('请输入python成绩:'))

            java=int(input('请输入java成绩:'))

        except:

            print('输入无效,请输入整数类型,请重新输入!!!')

            continue

        #将录入的学生信息保存到字典中

        student={'id':id,'name':name,'english':english,'python':python,'java':java}

        #将学生信息添加到列表中

        student_list.append(student)

        answar=input('是否继续添加?y/n:')

        if answar=='y' or answar=='Y':

            continue

        else:

            break

    #调用save()函数

    save(student_list)

    print('学生信息录入成功!!!')

def save(lst):

    try:

        stu_txt=open(filename,'a',encoding='utf-8')

    except:

        stu_txt=open(filename,'w',encoding='utf-8')

    for item in lst:

        stu_txt.write(str(item)+'\n')

    stu_txt.close()

def search():

    student_query=[]

    while True:

        id=''

        name=''

        if os.path.exists(filename):

            mode=input('按ID查找请输入1,按姓名查找请输入2:')

            if mode=='1':

                id=input('请输入学生ID:')

            elif mode=='2':

                name=input('请输入学生姓名:')

            else:

                print('您输入有误,请重新输入!!!')

                search()

            with open(filename,'r',encoding='utf-8') as rfile:

                student=rfile.readlines()

                for item in student:

                    d=dict(eval(item))

                    if id!='':

                        if d['id']==id:

                            student_query.append(d)

                    elif name!='':

                        if d['name']==name:

                            student_query.append(d)

            #显示查询结果

            show_student(student_query)

            student_query.clear()

            answer=input('是否继续查询y/n:')

            if answer=='y' or answer=='Y':

                search()

            else:

                break

def show_student(lst):

    if len(lst)==0:

        print('没有查询到学生信息,没有数据显示!!!')

        return

    #定义标题显示格式

    format_title='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'

    print(format_title.format('ID','姓名','English成绩','Python成绩','JAVA成绩','总成绩'))

    #定义内容的显示格式

    format_data='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'

    for item in lst:

        print(format_data.format(item.get('id'),

                                 item.get('name'),

                                 item.get('english'),

                                 item.get('python'),

                                 item.get('java'),

                                 int(item.get('english')+item.get('python')+item.get('java'))))

def delete():

    while True:

        student_id=input('请输入需要删除的学生ID:')

        if student_id!='':

            if os.path.exists(filename):

                with open(filename,'r',encoding='utf-8') as file:

                    student_old=file.readlines()

            else:

                student_old=[]

            flag=False  # 标记是否删除

            if student_old:

                with open(filename,'w',encoding='utf-8') as wfile:

                    d={}

                    for item in student_old:

                        d=dict(eval(item)) # 将字符串转成字典

                        if d['id'] != student_id:

                            wfile.write(str(d)+'\n')

                        else:

                            flag=True

                        if flag:

                            print(f'id为{student_id}的生信息已被删除')

                        else:

                            print(f'id为{student_id}没有找到。')

            else:

                print('无学生信息')

                break

            show()  # 删除之后要显示所有学生信息

            answer=input('是否据徐删除?y/n:')

            if answer=='y' or answer=='Y':

                continue

            else:

                break

        pass

def modify():

    show()

    if os.path.exists(filename):

        with open(filename,'r',encoding='utf-8') as rfile:

            student_old=rfile.readlines()

    else:

        return

    student_id=input('请输入学生ID:')

    with open(filename,'w',encoding='utf-8') as wfile:

            for item in student_old:

                d=dict(eval(item))

                if d['id']==student_id:

                    print('找到该学生,可以修改相关信息!!')

                    while True:

                        try:

                            d['english'] = int(input('请输入英语成绩:'))

                            d['python'] = int(input('请输入python成绩:'))

                            d['java'] = int(input('请输入java成绩:'))

                        except:

                            print('输入的类型有误,请输入整数!!!')

                        else:

                            break

                    wfile.write(str(d)+'\n')

                    print('修改完成!!!')

                else:

                    wfile.write(str(d)+'\n')

            answer=input('是否继续修改其他学生的成绩y/n')

            if answer=='y' or answer=='Y':

                modify()

def sort():

    show()

    if os.path.exists(filename):

        with open(filename,'r',encoding='utf-8') as rfile:

            student_list=rfile.readlines()

        student_new=[]

        for item in student_list:

            d=dict(eval(item))

            student_new.append(d)

    else:

        return

    asc_or_desc=input('请选择(0,升序 1,降序):')

    if asc_or_desc=='0':

        asc_or_desc_bool=False

    elif asc_or_desc=='1':

        asc_or_desc_bool=True

    else:

        print('你输入有误,请重新输入')

        sort()

    mode=input('请选择排序方式(1、按英语成绩排序 2、按python排序 3、按java排序 4、按总成绩排序)')

    if mode==1:

        student_new.sort(key=lambda x:int(x['english']),reverse=asc_or_desc_bool)

    if mode==2:

        student_new.sort(key=lambda x: int(x['python']), reverse=asc_or_desc_bool)

    if mode==3:

        student_new.sort(key=lambda x:int(x['java']),reverse=asc_or_desc_bool)

    if mode==4:

        student_new.sort(key=lambda x:int(x['english'])+int(x['python'])+int(x['java']),reverse=asc_or_desc_bool)

    else:

        print('您输入有误,请重新输入')

        sort()

    show_student(student_new)

def total():

    student_query=[]

    with open(filename,'r',encoding='utf-8') as rfile:

        students=rfile.readlines()

        for item in students:

            student=dict(eval(item))

            student_query.append(student)

        if student_query:

            print(f'一共有{len(student_query)}名学生')

        else:

            print('暂无学生信息')

def show():

    student_list=[]

    if os.path.exists(filename):

        with open(filename,'r',encoding='utf-8') as rfile:

            students=rfile.readlines()

            for item in students:

                student_list.append(dict(eval(item)))

            if student_list:

                show_student(student_list)

            else:

                print('暂未获取学生信息')

if __name__ == '__main__':

    main()

18.3、项目打包:

-安装第三方模块

-在线安装方式

pip install PyInstaller

pyinstaller -F E:\Pycharm\PyCharm\WORK_FILE\学生管理系统\studentem.py

 

reise Exception()#手动抛出异常

案例:

-水仙花:

代码:

# 开发时间: 2022/10/12 13:44

#输出100到999之间的水仙花数

print("是水仙花数的有:")

for num in range(100,1000):

    a = num // 100

    b = num // 10 - a*10

    c = num % 10

    if num == a*a*a + b*b*b + c*c*c:

        print(num)

运行结果:

 

-九九乘法表:

代码:

# 开发时间: 2022/10/12 14:22

for i in range(1,10):

    for j in range(1,i+1):

        sum = i * j

        print(str(i)+'*'+str(j)+'='+str(sum),end='\t') # 不换行输出

    print()

运行结果:

 

-递归函数-阶乘:

def fun(a,b):

    c=a*b

    return c

num=1

a=int(input("计算多少的阶乘"))

for i in range(1,a+1):

    num=fun(num,i)

print(num)

或:

def fac(n):

    if n==1:

        return 1

    else:

        return n*fac(n-1)

print(fac(6))

-递归函数-斐波那契数列:

# 斐波那契数列

def fei(n):

    if n == 1:

        return 1

    elif n == 2:

        return 1

    else:

        return fei(n - 1) + fei(n - 2)

n = int(input("求前几位的斐波那契数:"))

for i in range(1, n + 1):

    print(fei(i), end='\t')

-定义汽车类:

class Car(object):

    def __init__(self,type,no):

        self.type=type

        self.no=no

    def start(self):

        pass

    def stop(self):

        pass

class Taxi(Car):

    def __init__(self,type,no,company):

        super().__init__(type,no)

        self.company=company

    def start(self):

        print('乘客您好!')

        print(f'我是{self.company}出租车公司的,我的车牌是{self.no},请问您要去哪里?')

    def stop(self):

        print('目的地到了,请您付款下车,欢迎再次乘坐')

class FamilyCar(Car):

    def __init__(self,type,no,name):

        super().__init__(type,no)

        self.name=name

    def stop(self):

        print('目的地到了,我们去玩儿吧')

    def start(self):

        print(f'我是{self.name},我的汽车我做主')

if __name__ == '__main__':

    taxi=Taxi('上海大众','京A9765','长城')

    taxi.start()

    taxi.stop()

    print('-'*30)

    familycar=FamilyCar('广汽丰田','京B88888','武大郎')

    familycar.start()

    familycar.stop()

-推算时间:

import datetime

def inputdate():

    indate=input('请输入开始日期:(20200808)后按回车:')

    indate=indate.strip()

    datestr=indate[0:4]+'-'+indate[4:6]+'-'+indate[6:]

    return datetime.datetime.strptime(datestr,'%Y-%m-%d')

if __name__ == '__main__':

    print('-----------------推算几天后的日期----------------------------')

    sdate=inputdate()

    in_num=int(input('请输入间隔天数:'))

    fdate=sdate+datetime.timedelta(days=in_num)

    print('您推算的日期是:'+str(fdate).split(' ')[0])

-模拟客服自动回复:

def find_answer(question):

    with open('replay.txt','r',encoding='gbk') as file:

        while True:

            line=file.readline()

            if not line: #if line==''到文件末尾退出

                break

            #字符串的分割

            keyword=line.split('|')[0]

            reply=line.split('|')[1]

            if keyword in question:

                return  reply

    return  False

if __name__ == '__main__':

    question=input('Hi,您好,小蜜在此等主人很久了,有什么烦恼快和小蜜说吧')

    while True:

        if question=='bye':

            break

        #开始在文件中查找

        replay=find_answer(question)

        if not replay :  #如果回复的是False ,  not False-->True

            question=input('小蜜不知道你在说什么,您可以问一些关于订单、物流、账户、支付等问题,(退出请输入bye)')

        else:

            print(replay)

            question=input('小主,你还可以继续问一些关于订单、物流、账户、支付等问题(退出请输bye)')

    print('小主再见')

-定义一个圆类,计算器面积和周长:

import math

class Circle(object):

    def __init__(self,r):

        self.r=r

    def get_area(self):

        return math.pi*math.pow(self.r,2)

    def get_perimeter(self):

        return 2*math.pi*self.r

if __name__ == '__main__':

    r=int(input('请输入这个圆的半径'))

    c=Circle(r)

    print(f'圆的面积为:{c.get_area()}')

    print(f'圆的周长为:{c.get_perimeter()}')

    '''或'''

    print('圆的面积为:{:.2f}'.format(c.get_area()))

拓展:

控制台输出带颜色的文字方法参考:

python-pycharm控制台输出带颜色 - L·C - 博客园

符号大全--》参考:

符号大全-特殊符号-特殊符号大全

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值