python基础
2023-03-09 17:59:07 9 举报
AI智能生成
Python是一种高级编程语言,以其简洁易读的语法和强大的功能而受到广泛欢迎。它支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。Python的设计哲学强调代码的可读性和简洁性,尤其是使用空格缩进划分代码块,而非使用大括号或关键字。Python的标准库非常庞大,可以支持很多任务,包括网页爬取、数据分析、机器学习等。此外,Python还拥有丰富的第三方库,可以应用于各种领域。Python的跨平台特性使其在Windows、Linux和Mac OS X上都能运行。总的来说,Python是一种强大且灵活的语言,适合初学者和专业开发者使用。
作者其他创作
大纲/内容
python环境部署
Windows
下载安装
环境变量配置
将python的安装路径配置到环境变量中<br>
检测:python --version<br>
linux
默认安装
安装编辑器
数据类型
数字(Numbers)
整型
int
浮点型
float
复数
complex
字符串(String)
定义<br>
str();数字字母下划线组成的一串字符
访问
从左到右索引默认0开始的
从右到左索引默认-1开始的
str1 = 'aou! aou!'<br>print(str1[0])<br>print(str1[-1])
a<br>!
操作
合并拼接字符串: 用“+” <br>
print(str1[:5] + '!!!!')<br>print(str1[:9] + '!!!!')<br>
aou! !!!!<br>aou! aou!!!!!<br>
转义字符 \<br>
制表符 \t ,换行符\n
str2 = """多行字符串<br>可以使用Tab(\t),<br>也可以使用换行符(\n)"""<br>print(str2)
多行字符串<br>可以使用Tab( ),<br>也可以使用换行符(<br>)<br>
\在行尾 续行符<br>
>>>print("line1 \<br>... ... line2 \<br>... ... line3")<br>line1 ... line2 ... line3
\\ 反斜杠、单引号 \'、双引号\‘’<br>
>>>print("\\")<br>\<br>>>>print("\'")<br>'<br>>>>print("\"")<br>"
结束符<br>
end=''
>>> print('hello',end='\n')
输入<br>
input()
f-string<br>
使用表达式<br>
>>>x = 1<br>>>>f'{x+1}'<br>'2'<br>>>>y=1<br>>>>print(f'{y+1=}')<br>y+1=2
替换变量<br>
>>>name = 'Jason'<br>>>>f'hi,{name}'<br>'hi,Jason'
常用方法
title():首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写
>>>print(mystr.title())<br> Process Finished With Exit Code 0
rstrip() 删除字符串尾部空格,临时删除,永久删除则需要存入变量中;lstrip() 删除字符串开头空格;strip():删除两边空格
lstrip():删除左空白
>>>mystr = " process finished with exit code 0 "<br>>>>print(mystr.lstrip())<br>process finished with exit code 0
rstrip()
>>>print(mystr.rstrip())<br> process finished with exit code 0
strip()
>>>print(mystr.strip())<br>process finished with exit code 0
find() 查找,返回改字符串下标,否则返回-1<br>
>>> str1 = 'process finished with exit code 0'<br>>>> print(str1.find('with'))<br>17
index(),返回改字符串下标,没有报错
>>> print(str1.index('with'))<br>17
count() 返回所查字符串的个数<br>
>>> print(str1.count('with'))<br>1<br>>>> print(str1.count('o'))<br>2
rfind(), 返回字符串最后一次出现的位置,如果没有匹配项则返回-1
str1.rfind('with')
rindex(), 返回子字符串 str 在字符串中最后出现的位置,如果没有匹配的字符串会报异常,你可以指定可选参数[beg:end]设置查找的区间
str1.rindex('with')
replace() 修改, str.replace(old, new[, max])<br> old -- 将被替换的子字符串。<br> new -- 新字符串,用于替换old子字符串。<br> max -- 可选字符串, 替换不超过 max 次<br>
new_str = str1.replace('with','a',3)
split() 分割,通过指定分隔符对字符串进行切片,返回分割后的字符串列表
#new_str = str1.replace('with','a')<br>new_str = str1.replace('with','a',3)#修改次
join(),将序列中的元素以指定的字符连接生成一个新的字符串,返回通过指定字符连接序列中元素后生成的新字符串
mylist = ['aa','bb','cc']<br>new_str1 = '***'.join(mylist)
capitalize()将字符串的第一个字母变成大写,其他字母变小写
C_str = str1.capitalize()
ljust rjust ceter 字符串对齐, 语法 字符串序列.ljust(长度,填充字符)
str1.rjust(50, '0')
判断<br>
判断以某个字串开头startswith
>>> str1 = 'process finished with exit code 0'<br>>>> print(str1.startswith('p'))<br>True
判断以某个字串结尾endswith
>>> print(str1.endswith('0'))<br>True
列表(List)
定义
把逗号分隔的不同的数据项使用方括号括起来,可以是不同的数据类型[23,565,'aaa'], 列表数据可变<br>
格式
[数据1,数据2,数据3,数据4...]
name_list = ['Tom', 'Lily', 'Rose', 'Tom', 'Ann']
访问
从左到右索引默认0开始的
从右到左索引默认-1开始的
>>>x = [1,3,5,6,'red',8,'blue']<br>>>>print(x[5])<br>8<br>>>>print(x[-3])<br>red<br>>>>print(x[1:-3])<br>[3, 5, 6]
常用操作<br>
添加
append()
列表结尾追加数据 语法 列表序列.append(数据)<br> 如果追加数据是序列,则将整个序列追加至结尾处
name_list.append('Sarah')<br>name_list.append([11,22])#如果追加数据是序列,则将整个序列追加至结尾处
extend()
将字符串或列表数据拆开 加至列表结尾
name_list.extend('Sarah')<br>name_list.extend([11,22,'Eric'])
insert()
语法
列表.insert(位置下标,数据)
name_list.insert(1,'aaa')<br>print(name_list)
insert()在指定索引处添加空间,并将插入的值存储到这个地方。这种操作将列表中既有的每个元素都右移一个位置
查找
index()
返回指定数据所在位置的下标(不存在报错) <br>列表序列.index(数据,开始位置下标,结束位置下标)
print(name_list.index('Tom'))<br># #print(name_list.index('tom'))#数据不存在报错
count()
统计指定数据在当前列表中出现的次数(不存在返回0)
print(name_list.count('Tom'))<br>print(name_list.count('Toms'))#数据不存在返回0
len()
访问列表长度 即列表中数据的个数
name_list = ['Tom', 'Lily', 'Rose', 'Tom', 'Ann']<br>print(len(name_list))<br>print(name_list.__len__())
判断
in
判断指定数据在某个列表序列 存在返回True 否则返回False
print('Tom' in name_list)
not in
判断指定数据不在某个列表序列 不存在返回True 否则返回False
print('Tom' not in name_list)
修改
修改指定下标的数据
>>>x[2] = 'aou'<br>>>>print(x)<br>[1, 3, 'aou', 6, 'red', 8, 'blue']
删除
del
语法
del 目标 或者del(目标)
del name_list<br>del(name_list)
可删除指定下标数据
del name_list[2]
pop()
删除指定下标数据 如未指定则删除最后数据
pop_name = name_list.pop()<br>pop_name = name_list.pop(2)
remove
remove(数据),删除匹配到的第一项
name_list.remove('Tom')
clear
清空列表
name_list.clear()
排序
reverse
逆序
name_list.reverse()
sort
升序 降序 默认升序
list1 = ['aAfe', 'kfre', 'Agrew', 'Bew', '43', '?', '6', '387', '/', '\\', '!', '~']<br>list1.sort()
语法
列表序列.sort(key=None,reverse=False) reverse表示排序规则,True降序,False升序
list1.sort(reverse=True)<br>list1.sort(reverse=False)
list1.sort(reverse=False,key=str.lower)
遍历
列表中遍历 <br>
while
print(name_list)<br>i= 0<br>while i <len(name_list):<br> print(name_list[i])<br> i += 1
for
print(name_list)<br>for i in name_list:<br> print(i)
切片
格式
[start:end:step]
start:起始索引,从0开始,-1表示结束<br> end:结束索引<br> step:步长,end-start,步长为正时,从左向右取值。步长为负时,反向取值
name_list = ['Tom', 'Lily', 'Rose', 'Tom', 'Ann']<br>print(name_list[:])<br>print(name_list[:2])<br>print(name_list[0:3:2])<br>print(name_list[5:0:-1])
复制
copy()
list2 = name_list.copy()
列表嵌套
name_list1 = [['赵', '钱', '孙', '李'], ['周', '吴', '郑', '王'], ['冯', '陈', '褚', '卫']]<br>print(name_list1[2])<br>print(name_list1[2][1])
元组(Tuple)
定义
定义使用() 逗号隔开,数据可为不同数据类型
t1 = ('aa', 'bb', 'cc', 'dd')<br>t2 = ('aa', 'bb', ['cc', 'dd'])
常见操作<br>
查找
index()
print(t1.index('bb'))<br>print(t1.index('bba'))#不存在数据 报错
按下标查找
print(t1[0])
修改
不可修改,元组中包含有可修改类型数据,如列表,则列表中数据可修改
t2[2][0] = 'tom'
删除
元组中的元素值是不允许删除的,但可以使用del语句来删除整个元组
del t1
切片
格式
[start:end:step]
start:起始索引,从0开始,-1表示结束<br> end:结束索引<br> step:步长,end-start,步长为正时,从左向右取值。步长为负时,反向取值
print(t1[4:0:-1])
len()
访问列表长度 即元组中数据的个数
print(len(t2))
字典(Dictionary)
特点
符号为花括号,数据为键值对形式出现,各个键值对之间用键值对隔开,字典为可变类型
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
常见操作
增<br>
写法(注意 如果key存在则修改 对应的值,如果不存在则新增),字典序列[]=值
# dict1['name'] = 'Rose' # {'name': 'Rose', 'age': 20, 'gender': '男'}<br># dict1['id'] = 110 # {'name': 'Rose', 'age': 20, 'gender': '男', 'id': 110}
update
将一个字典添加到另一个字典<br>
dict2 = {'1': '1111', '2': '2222'}<br>dict1.update(dict2)
删
del()/del <br>
删除字典或者删除指定的键值对
# del(dict1)<br># print(dict1)<br># del dict1['name'] # {'age': 20, 'gender': '男'}<br># dict1.clear() # {}<br># print(dict1)
clear() <br>
清空字典
dict1.clear() # {}
改
字典序列[key]=值
查
key值查找
如果key存在则返回对应的值,不存在报错
print(dict1['name']) # Tom
get(),字典序列.get(key,默认值)
<br>注意 如果当前查找的key不存在则返回第二个参数(默认值)<br>如果省略第二个参数,则返回None
# print(dict1.get('age')) # 20<br># print(dict1.get('id', 110)) # 110<br># print(dict1.get('id')) #None
keys()
查找字典中所有的key 返回可迭代对象
# keys()<br># print(dict1.keys()) # dict_keys(['name', 'age', 'gender'])<br># print(type(dict1.keys())) # <class 'dict_keys'>
values()
查找字典中所有的值 返回可迭代对象
print(dict1.values()) # dict_values(['Tom', 20, '男'])
items()
返回所有的键值对,返回可迭代对象 里面数据是元组
print(dict1.items()) # dict_items([('name', 'Tom'), ('age', 20), ('gender', '男')])
遍历
遍历key
for key in dict1.keys():<br> print(key)
遍历value
for value in dict1.values():<br> print(value)
遍历键值对
for item in dict1.items():<br> print(item)
for key, value in dict1.items():<br> print(f'{key} = {value}')
嵌套
dict11 = {'name': 'Tom', 'age': 20, 'gender': '男', 'aa': {'1': '1111', '2': '2222'}}
集合
定义
创建集合使用{}或者set(),创建空集合只能用set(),{}是空字典
s1 = {'10', '20'}
特点
不允许重复数据 无顺序<br>集合是可变类型
s2 = {10, 20, 30, 30, 20}<br>print(s2) # {10, 20, 30}
s3 = set('wfewrgjiwr')<br>print(s3) # {'e', 'g', 'r', 'j', 'f', 'i', 'w'}
常见操作
增<br>
add()
集合有去重功能 当追加数据是重复的则不进行任何操作
s1.add(100) # {'20', 100, '10'}
update()
追加的数据是序列
s1.update([10, 20, 30, 40, 50]) # {40, 10, 50, '10', 20, '20', 30}
删
remove()
删除集合中指定数据 如不存在报错
s7 = {10, 20, 30, 40, 50}<br> s7.remove(10) # {40, 50, 20, 30}
discard()
删除集合中指定数据 如不存在也不报错
s7.discard(10) # {40, 50, 20, 30}
pop()
随机删除集合中某个数据并返回该数据
del_num = s7.pop()<br>print(del_num) # 40
查
in
print(10 in s7) # True<br>
not in<br>
print(10 not in s7) # False
变量和运算符/注释
变量
命名规则
以字母或下划线开头的字母数字下划线组合
不能用关键字
区分大小写
变量作用域
定义<br>
指变量生效的范围,分为局部变量和全局变量
局部变量
定义在函数体内的变量 只在函数体内生效<br> 在函数体内部 临时保存数据 函数调用完成后 则销毁局部变量
全局变量
函数体内外都能访问
global
声明是全局变量,函数体内声明global a,在函数体外也能访问a
a = 100<br>print(a)<br>def testA():<br> print(a)<br>def testB():<br> global a # 声明a是全局变量<br> global b<br> b =300<br> a = 200<br> print(a)<br>testA()<br>testB()<br>print(a)<br>testA()<br>print(b)
100<br>100<br>200<br>200<br>200<br>300
运算符
算数运算符
加+、减-、乘*、除/
取模%、幂**、整除//(取商的整数部分,向下取整)
//
>>>23//8<br>2<br>->>>23//8<br>-3
%(返回出发的余数)
>>>23%8<br>7
比较运算符
等于==、不等于!=、大于>、小于<、大于等于>=、小于等于<=
返回布尔型<br>
>>>3<=2<br>False<br>2>>>!=3<br>True<br>>>>1+1==2<br>True
逻辑运算符
and:与,同时满足条件
>>>(1>2 and 3>2)<br>False<br>>>>1<2 and 3>2<br>True
or:或,至少满足一条
>>>1>2 or 3>2<br>True
not:非,条件为False,则返回True
>>>not 1>2<br>True<br>>>>not 3>2<br>False
赋值运算符<br>
=、+=、-=、*=、/=、%=、**=、//=<br>
成员运算符
in
在指定序列中找到指定之,返回True,否则返回False<br>
>>>1 in [1,2,3]<br>True<br>>>>1 in [3,4,5]<br>False
not in<br>
在指定序列中没找到指定之,返回True,否则返回False
>>>'s' not in 'se'<br>False<br>>>>'s' not in 'rg'<br>True
运算符优先级
()高于** 高于 * 、/、 //、 % 高于 +、 -
同优先级运算从左到右,逻辑运算符and 拥有更高优先级
>>>True or False and False<br>True<br>>>>not True or False and False<br>False<br>>>>not False or False and False<br>True
三目运算符
语法
条件成立执行的表达是 if 条件 else 条件不成立执行的表达式
a = 1<br>b = 2<br>c = a if a > b else b<br>print(c)<br>aa = int(input("输入aa:"))<br>bb = int(input("输入bb:"))<br>cc = aa - bb if aa > bb else bb - aa<br>print(cc)
注释
单行注释 #<br>
多行注释 三个引号(单引号或双引号)<br>
控制结构
条件
if语法<br>
if 语法<br>if 条件:(注意缩进)<br> 条件成立执行代码1<br> .。。<br>elif 条件2:<br> 条件2成立执行代码1<br> ...<br>else:<br> 条件都不成立执行语句代码<br> 。。。。<br>
age = int(input('输入年龄'))<br>if age >= 18 :<br> print("可以上网")<br>else:<br> print("未成年")
if嵌套语法
if 条件1:<br> 条件1成立执行代码<br> 。。。<br> if 条件2:<br> 条件2成立执行的代码
money = int(input("1为有钱非1为无:"))<br>seat = int(input("1为有座非1为无:"))<br>if money == 1:<br> print("上车")<br> if seat == 1:<br> print("有空座")<br> else:<br> print("无空座位")<br>else:<br> print("不能坐车")
循环
while
语法<br>
while 条件:<br> 条件成立重复执行的代码
i = 0<br>while i < 5:<br> print('减肥')<br> i += 1
退出循环的方式
breaker 推出整个循环
i = 1<br>while i <= 5:<br> if i== 4:<br> print('吃饱')<br> break<br> print(f'吃了第{i}个苹果')<br> i += 1
continue 当条件成立 退出当前一次循环,继续执行下一次循环
j = 1<br>while j <= 5:<br> if j ==3:<br> print('吃出个虫,这个不吃了')<br> #continue前要执行要从修改计数器 否则会进入死循环<br> j += 1<br> continue<br> print(f'吃了第{j}个苹果')<br> j += 1
while循环嵌套
语法
while 条件1:<br> 条件1成立执行的代码<br> 。。。<br> while 条件2:<br> 条件2成立执行的代码<br> 。。。
print('===========九九乘法表================')<br>j =1<br>while j<= 9:<br> i =1<br> while i<=j:<br> print(f'{i}*{j}={i*j}',end='\t')<br> i+=1<br> print()<br> j+=1
for
语法<br>
for 临时变量 in 序列:<br> 重复执行的代码1<br> 重复执行的代码2
str1 = input("输入字符串:")<br>for i in str1:<br> if i == 'e':<br> break<br> elif i== 'i':<br> continue<br> print(i)
退出循环的方式
breaker 推出整个循环
continue 当条件成立 退出当前一次循环,继续执行下一次循环
函数
定义函数
def 函数名(参数):<br> 代码。。。
def add_num1():<br> result = 1 + 2 <br> print(result)<br><br>
调用函数
函数名(参数)
add_num1()
参数
形参
定义的函数里允许调用者提供一些参数,就把这些参数写在括号里
def add_num(n1, n2):<br> result1 = n1 + n2 <br> print(result1)<br># add_num(10, 20)
缺省参数(默认参数)
调用函数时 可不传默认参数
位置参数
调用函数时根据函数定义的位置来传递参数
传递和定义参数的顺序和个数必须保持一致
位置参数必须写在关键字参数前面<br>所有的位置参数必须在默认参数前,包括函数的定义和调用
关键字参数
通过键=值的形式加以指定
def user_info(name, age=40, gender='男'):<br> print(f'名字{name},年龄{age},性别{gender}')<br># user_info('tom', 3, '男')<br># user_info('rose', gender='女', age=20)
不定长参数(可变参数)
包裹位置传递
传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组,*args 返回元组
def user_info1(*args):<br> print(args)<br> return args<br>user_info1('Tom')<br>user_info1('Tom', 19)<br>a = user_info1('tom', 20)<br>print(a[1])
包裹关键字参数
收集所有的关键字参数,返回的是一个字典,无论是包裹位置还是包裹关键字传递,都是一个组包的过程
def user_info4(**kwargs):<br> print(kwargs)<br>user_info4(name='Tom')<br>user_info4(name='Tom', age=18, gender='男')
函数返回值
return 表示函数调用的结束并将结果返回至函数调用处<br>
一个函数两个返回值
def return_num():<br> # return 1, 2 # 返回元组<br> # return (10, 20)<br> # return [100, 300]<br> return {'name': 'python', 'age': 30}<br>result = return_num()<br>print(result)
执行流程
先定义后调用
调用函数 解释器会回到定义函数的地方去执行函数体,定义的时候函数体没有被执行
函数说明文档
函数体第一行 多行注释
def sum_num(a, b):<br> '''<br> 求和函数<br> :param a:<br> :param b:<br> :return:<br> '''<br> return a + b
查看
help(sum_num)
函数嵌套调用
def testB():<br> print('bbbbbbbb')<br> return 1<br>def testA():<br> print('aaaaaaaaaaaaa')<br> testB()<br> return<br> print('end')<br>testA()
递归
特点
函数内部自己调用自己 <br>必须有出口
def sum_numbers(num):<br> if num ==1:<br> return 1<br> return num +sum_numbers(num-1)<br>sumresult = sum_numbers(3)<br>print(sumresult)
常见函数
lambda
如果一个函数有一个返回值,并且只有一句代码,可以使用lambda简化
fn1 = lambda a, b: a + b<br>print(fn1(1, 2))
语法
lambda 参数列表:表达式
fn2 = lambda: 100<br>print(fn2) # lambda内存地址 <function <lambda> at 0x030F8E80><br>print(fn2()) # 100
参数形式
无参数 fn = lambda: 100<br> 一个参数 fn = lambda a: a<br> 两个参数 fn = lambda a, b, c=100: a + b + c<br> 可变参数 *args lambda *args:args 注:可变参数传入到lambda之后,返回值为元组
注意
lambda表达式的参数可有可无,函数的参数在lambda表达式中完全适用<br> lambda表达式能接收任何数量的参数但只能返回一个表达式的值
abs()
求绝对值
print(abs(-7)) # 7
round()
四舍五入
print(round(1.2)) # 1<br>print(round(1.6)) # 2
map()
map(func,lst) 将传入的函数变量func作用到lst变量的每一个元素中,<br> 并将结果组成新的迭代器返回
list1 = [1, 2, 3, 4, 5]<br>def func(x):<br> return x ** 2<br>result = map(func, list1)<br>print(result) # <map object at 0x0000026D5F36C9C8><br>print(list(result)) # [1, 4, 9, 16, 25]
reduce(func, lst)
其中func必须有两个参数,每次func计算的结果继续和序列的写一个元素做累计计算
# 计算list1序列中各个数字的累加值和<br>import functools<br>list1 = [1, 2, 3, 4, 5]<br>def func(a, b):<br> return a + b<br>result = functools.reduce(func, list1)<br>print(result) # 15
filter(func, lst)
用于过滤序列,过滤不符合条件的元素,返回一个filter对象<br> 如果要转换为列表,可以用list()来转换
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]<br>def func(x):<br> return x % 2 == 0<br><br>result = filter(func, list1)<br>print(result) # <filter object at 0x00000225167AC988><br>print(list(result)) # [2, 4, 6, 8, 10]
文件处理
打开文件
写法 <br>
open(name,mode)
name:文件名 可包括具体路径<br> mode:访问模式 只读 写入 追加
访问模式
-- w 写<br> 文件不存在 新建文件<br> 文件对象.write('内容') 覆盖原有内容
f = open('test.txt', 'w')
-- r 读<br> 文件不存在报错<br> 不支持write()<br> 访问模式省略 时 默认为 r
f = open('test.txt', 'r')
-- a 追加<br> 如果文件不存在 则新建<br> write() 在原有内容上追加
f = open('test2.txt', 'a')
常用方法<br>
read()
文件对象.read(num)<br> num标识要从文件中读取的数据的长度(单位是字节),如未传入num,读取所有数据
#print(f.read())<br># print(f.read(8))
write()
写操作
f.write('rr')
readlines()
按照行的方式把文件内容进行一次性读取,并且返回的是一个列表,每一行的数据为一个元素
readline()
一次读取一行内容
seek()
用来移动文件指针
语法
文件对象.seek(偏移量,起始位置)<br> 起始位置:0 文件开头 1当前位置 2 文件结尾<br> r: 改变文件指针位置,改变读取数据开始位置或文件指针放结尾(无法读取数据)<br> a: 改变文件指针位置,可以读取数据<br>
文件操作 os<br>
os.rename(目标文件名,新文件名)
文件重命名
os.remove(目标文件名)
删除文件
os.getcwd()
获取当前目录
os.chdir()
改变目录路径<br>
os.listdir()
获取某个文件夹下所有文件 返回一个列表<br>
os.mkdir(文件夹名字)
建文件夹<br>
os.rmdir(文件夹名字)
删文件夹
面向对象
类
简介
用来描述具有相同的属性和方法的对象的集合,定义了该集合中每个对象所共有的属性和方法
class Car(object):<br> def __init__(self, make, model, year):<br> self.make = make<br> self.model = model<br> self.year = year<br> self.odometer_reading = 0<br><br> def get_descriptive_name(self):<br> long_name = str(self.year) + ' ' + self.make + ' ' + self.model<br> return long_name.title()<br><br> def read_odometer(self):<br> print('This car has ' + str(self.odometer_reading) + ' miles on it')<br><br> def update_odometer(self, mileage):<br> if mileage >= self.odometer_reading:<br> self.odometer_reading = mileage<br> else:<br> print("You can't roll back an odometer!")<br><br> def increment_odometer(self, miles):<br> self.odometer_reading += miles
命名规则
要满足标识符命名规则
类的创建,访问。。。
class Car(object):<br> '''<br> 车类<br> '''<br> odometer_reading = 0
不去继承自己书写的类,默认级成所有类的顶级类 object ;其他类都叫派生类
引号中,是类的说明,在类的第一行,通过.__doc__查看<br>
print(Car.__doc__)
类变量
odometer_reading是类变量,它的值能在这个类里面的所有实例间共享,可以通过Car.odometer_reading访问
__init__()<br>
__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法
self
self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数
创建实例对象<br>
使用类的名称 Car来实例化,并通过 __init__ 方法接收参数
my_new_car = Car('audi', 'a4', 2016)
类属性
访问属性
通过 . 来访问对象的属性<br>
my_new_car.read_odometer()
增加修改删除类的属性
my_new_car.age = 1<br>my_new_car.age = 8<br>del my_new_car.age
类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是重新创键了一个实例属性
定义
类属性就是类对象所拥有的属性<br> 被该类的有所实例对象所共有<br> 类属性可以使用类对象或实例对象访问
优点<br>
记录的某行数据始终保持一致时,则定义类属性<br> 实例属性要求每个对象为 其单独开辟一份内存空间来记录数据<br> 类属性为全类所共有,仅占一份内存,更加节省内存空间
类方法的特点
需要用装饰器@classmethod来标识其为类方法,第一个参数必须是类对象,一般以cls作为第一个参数
方法使用场景
当方法中需要使用类对象(入访问私有属性等)是定义类方法<br> 类方法一般和类属性配合使用
封装
将属性和方法写到类里面,可以为属性添加私有属性
继承
定义
指多个类之间的所属关系,及子类默认继承父类的所有属性和方法
#父类<br>class A(object):<br> pass<br><br># 子类<br>class B(A):<br> pass
注意
创建子类时,父类必须位于子类前面
类别<br>
单继承
单一的继承关系,一个父类继承给一个子类
多继承<br>
一个类同事继承了多个父类
当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法
重写(子类重写父类同名属性和方法)
子类和父类拥有同名属性和方法,用子类去创建对象,该对象调用同名属性和方法,调用的是子类里面封装的属性和方法
子类调用父类同名方法和属性
用父类方法,为保证调用到的是父类属性,必须在调用前调用父类初始化
super()
关联父类子类
多层继承中使用
super(当前类名.self).函数名<br> 父类中写super
私有属性
写法<br>
在方法属性前加 __<br>
注意<br>
对象不能访问私有属性和方法 子类无法继承父类的私有属性和私有方法<br>一般定义get_XX、set_XX函数来获取和修改私有属性
多态
定义
一种使用对象的方式,子类重写父类的方法,调用不同的子类对象的相同父类方法,可以产生不同的执行结果
好处
调用灵活,有了多态更容易编写通用的代码,做出通用的编程,以适应需求的不断变化
实现步骤
定义父类,并提供公共方法<br> 定义子类,并重写父类方法<br> 传递子类对象给调用者,可以看到不同子类执行效果不同
静态方法
静态方法特点
需要通过装饰器@staticmethod来进行修饰,静态方法既不需要传递类对象,也不需要传递实例对象(形参没有self/cls)<br> 静态方法也能通过实例对象和类对象访问
静态方法的使用场景
当方法中既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象(如类属性,类方法,创建实例属性)时,定义静态方法<br> 取消不需要的参数传递,有利于减少不惜要的内存占用和性能消耗
异常
定义
检测到错误,解释器就无法继续执行了,出现一些错误的提示,这就是异常
try:<br> code #需要判断是否会抛出异常的代码,如果没有异常处理,python会直接停止执行程序<br>except: #这里会捕捉到上面代码中的异常,并根据异常抛出异常处理信息<br>#except ExceptionName,args: #同时也可以接受异常名称和参数,针对不同形式的异常做处理<br> code #这里执行异常处理的相关代码,打印输出等<br>else: #如果没有异常则执行else<br> code #try部分被正常执行后执行的代码<br>finally:<br> code #退出try语句块总会执行的程序
捕获异常
语法
try:<br> 可能发生异常的代码<br>except:<br> 发生错误的时候执行的代码
捕获指定异常
try:<br> 可能发生异常的代码<br> except 异常类型:<br> 如果捕获到该异常类型执行的代码
捕获多个指定异常
try:<br> 可能发生异常的代码<br>except (异常类型1,异常类型2):<br> 如果捕获到该异常类型执行的代码
try-finally 语句
finally表示无论是否发生异常都要执行的代码
try:<br><语句><br>finally:<br><语句> #退出try时总会执行<br>
自定义异常<br>
通过创建一个新的异常类,可以命名它们自己的异常
模块<br>
定义
每一个以扩展名.py结尾的Pyhton源代码文件都是一个模块,包含了 Python 对象定义和Python语句
导入和使用<br>
导入模块 <br>
import 模块名
import math<br>print(math.sqrt(9))
调用
模块名.函数名
from…import
从模块中导入一个指定的部分到当前命名空间中
from math import sqrt
不能使用模块名.函数名,直接使用函数名
print(sqrt(9))
from…import*
把一个模块的所有内容全都导入到当前的命名空间
from math import *
不能使用模块名.函数名,直接使用函数名
print(sqrt(9))
别名
import 模块名 as 别名
定义了别名就不能再使用原模块名
import time as tt<br>tt.sleep(2)<br>print('hello')
from 模块名 import 函数 as别名
定义了别名就不能再使用原函数名
from time import sleep as sl<br>sl(2)<br>print('hello')
搜索路径
模块搜索路径存储在 system 模块的 sys.path 变量中
import sys<br>print(sys.path)
变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录
重名
自己文件名不要和已有文件名重复,否则导致模块功能无法使用
使用from模块名 import 函数的时候,如果函数名字重复,调用到的是最后定义或者导入的函数
from time import sleep<br># def sleep(a):<br># print('自定义的')<br>sleep(2)
变量也可以覆盖模块
import time<br>#print(time)<br>time=1<br>print(time)
包
定义
将有联系的模块组织在一起。即放到统一文件夹下,并且在这个文件夹创建一个名字为__init__.py文件(这个文件 用于标识当前文件夹是一个包,控制着包的导入行为)
导入
import 包名.模块名
import mypackage.my_module1<br>mypackage.my_module1.info_print1()
from 包名 import *
from mypackage import *<br>my_module2.info_print1()
调用 <br>
模块名.目标
0 条评论
下一页