Python学习

1.变量类型:

整数型(int)

浮点型(float)

布尔型(boolean):Ture(男)/False(女)。开发中用sex,gender表示性别


sex = True
gender = False

字符串(string):使用单引号或双引号。可以单引号与双引号互相嵌套。


str1 = "那样的夜色太美,你太温柔"
str2 = '才会在刹那之间,只想和你到白头'
str3 =  '"那样的夜色太美,你太温柔"'
ste4 = "'才会在刹那之间,只想和你到白头'"

列表(list) 用[ ]表示


name_list = ['金金','银银']

元组(tuple) 用( )表示


age_tuple = (18,19,20,21,22)

字典(dictionary) 用{ key : value, key1 : value1 }表示


person = {'name':'金金','age':'21'}

查看数据类型type()


type(str1)
#string
type(name_list)
#list
type(age_tuple)
#tuple
type(person)
#dict

2.标识符和关键字

标识符的创建要做到“见名知意”。

标识符的创建注意三点:

1.标识符由字母、数字、下划线三部分组成。

2.不能以数字开头。

3.标识符不能为关键字。

分为“大驼峰”和“小驼峰”。其中大驼峰为所有单词的开头字母都要大写,如:NameList,AgeList。小驼峰为首单词首字母开头小写,其余字母开头大写,如:nameList,ageList。

3.强制类型转换(需要什么类型前面就写相对应的关键字)

3.1强制转换为整型 int()

小数转换为整型时只保留其整数部分。

布尔类型转换为整型时,True对应1,False对应0。

字符串转换为整型时,只有字符串是整数时才能转换为对应的int类型。

3.2强制转换为浮点型 float()

整型转换为float时,小数点后面加一个0。

字符串转换为float时,只有字符串是小数时才能转换为对应的int类型。

3.3强制转换为布尔型bool()

整型转换为布尔型时,除了0以外的所有正数和负数都是True,只有0是False。

浮点型转换为布尔型时,除了0.0以外的所有数都是True,只有0.0是False。

当列表,元组,字典中内容为空时,转换为布尔型时是False。内容不为空时是True。


#什么情况下时False
print(bool(''))
print(bool(""))
print(bool(0))
print(bool(0.0))
print(bool({}))
print(bool([]))
print(bool(()))

3.4强制转换为字符串型str()

整型转换为字符串(大部分应用场景)

4.运算符

4.1算数运算符(以a=5,b=9为例)

+

a+b=14

-

a-b=-4

*

a*b=45

/

a/b=0.56

整除

//

a//b=0

取余

%

a%b=5

**

a**b(5的9次方)

小括号

( )

提高运算优先级,先算括号里面的,(1+2)*3

两个字符串做加法运算相当于把两个字符串拼接。


str1 = '那样的夜色太美,'
str2 = '你太温柔。'
str3 = str1 + str2
print(str3)   #那样的夜色太美,你太温柔。

数字和字符串做加法运算时会报错。

数字和字符串做乘法运算时,会重复字符串。


str1 = '靓仔'
str2 = str1*5   #靓仔靓仔靓仔靓仔靓仔

4.2赋值运算符

+=

a=a+2

a+=2

-=

a=a-2

a-=2

*=

a=a*2

a*=2

/=

a=a/2

a/=2

//=

a=a//2

a//=2

%=

a=a%2

a%=2

**=

a=a**2

a**=2

4.3比较运算符(只返回True或False,判断正确返回True,判断错误返回False)

例如a = 10 ,b = 20

==

等于

a == b(False)

<=

小于等于

a <= b(True)

>=

大于等于

a >= b(False)

!=

不等于

a != b(True)

<

小于

a < b(True)

>

大于

a > b(False)

4.4逻辑运算符

and

两边都是True,才是True。只要有False,总体就为False。

or

两边只要有一边为True则为True。两边全是False时,总体为False。

not

not True --> False;not False --> True

and前面为False时,后面代码不会执行。

or前面为True时,后面代码不会执行。


a = 50
a > 10 and print("靓仔") #输出靓仔
a < 10 and print("靓仔") #没有输出

a > 10 or print("靓仔") #没有输出
a < 10 or print("靓仔") #输出靓仔

5.输入输出

5.1普通输出


print('我今年10岁了')
print('我今年11岁了')
print('我今年12岁了')

5.2格式化输出( %s表示字符串,%d表示数值。)


age = 10
print("我今年%d岁了" % age)
age += 1
print("我今年%d岁了" % age)
age += 1
print("我今年%d岁了" % age)

name = '张麻子'
print('我的名字是%s,我今年%d岁了' % (name,age))

#我今年10岁了
#我今年11岁了
#我今年12岁了
#我的名字是张麻子,我今年12岁了

5.3输入 input()


phoneNumber = input('请输入你的紧急联系人电话:') #phoneNumber是字符串,后面不可以为%d
print("我的紧急联系人电话是:%s" %phoneNumber)

6.流程控制语句

if语句


if 条件:
    条件为True时执行的代码

age = 21
if age >= 18:
    print('你可以去网吧了!')

if-else语句


if 条件:
    条件为True时执行的代码
else:
    条件为False时执行的的代码

age = 21
if age >= 18:
    print('你可以去网吧了!')
else
    print('快去写作业!!!')

elif语句


score = int(input('请输入你的成绩:'))
if score >= 90:
    print('优秀')
elif score >= 80:
    print('良好')
elif score >= 70:
    print('中等')
elif score >= 60:
    print('及格')
else:
    print('不及格')

for语句


for 变量 in 遍历的对象:
    方法体

word = '那样的夜色太美,你太温柔。'
for i in word
    print(i)

range语句


#遍历[0,5) 左闭右开区间
for i in range(5):
    print(i)

#遍历[1,5) 左闭右开区间
for i in range(1,6):
    print(i)

遍历[1,10),首项为1,公差为3的递增数列 
for i in range(1,10,3):
    print(i)

7.高级数据类型

7.1字符串高级


len() #获取字符串长度
find() #查找指定内容是否字符中,在,返回指定内容下标;不在返回-1
startswith()  endswith() #判断字符串是不是以xxx开头,返回True or False
count("海",0,5) #返会start和end之间指定内容出现的次数
replace() #替换字符串中指定内容
spilt() #通过参数内容切割字符串,分割字符串之后会返回一个列表
upper()  lower() #将字符串中的大小写互换
strip() #用于移除字符串头尾指定的字符(默认为空格)或字符序列
join() #字符串拼接
capitalize() #首字母变为大写,其余字母为小写
casefold()# 全变为小写
title()# 开头字母全为大写
swapcase()# 大写变小写,小写变大写

name = '唐 伯 虎 点 秋 香 是 一 个 legend !'
print(len(name))
# 26
print(name.find('有'))
# -1
print(name.startswith('唐'))
# True
print(name.count('唐'))
# 1
print(name.replace('唐','小唐'))
# 小唐 伯 虎 点 秋 香 是 一 个 legend !
print(name.split( ))
# ['唐', '伯', '虎', '点', '秋', '香', '是', '一', '个', 'legend', '!']
print(name.upper())
# 唐 伯 虎 点 秋 香 是 一 个 LEGEND !
print(name.strip('!'))
# 唐 伯 虎 点 秋 香 是 一 个 legend 
sign = '*'
print(sign.join(name))
# 唐* *伯* *虎* *点* *秋* *香* *是* *一* *个* *l*e*g*e*n*d* *!
7.1.1左中右对齐

center(width,fillchar='') #中对齐
ljust(width,fillchar='') #左对齐
rjust(width,fillchar='') #右对齐
zfill(width) #用0填充左侧
7.1.2替换

expandtabs() #用空格来替换tab,尽量使用空格
replace(old,new,count=-1)
translate(table)

table = str.maketrans("ABCDEFG","1234567")
new = "I love FDKQ".translate(table)
#I love 64KQ

#判断字符是否为python标识符
import keyword
keyword.iskeyword("if")

#使用strip去除字符串中的元素,默认为空白
7.1.3拆分和拼接

partition("")#使用特定字符来进行切分,从左往右
rpartition()#从右往左

spilt(sep=None,maxsplit=-1)
rspilt()
spiltlines()#将字符串按行进行分割,结果以列表的形式返回

join()#进行拼接,可迭代对象可以是元组或列表
website = ".".join(["www","baidu","com"])
website = ".".join(("www","baidu","com"))
#www.baidu.com
7.1.4格式化字符串

year = 2023
"今年是{}年".format(year)

test = "1+2={},2的平方={},3的立方={}".format(1+2,2*2,3*3*3)
1+2=3,2的平方=4,3的立方=27

"{1:@>10}{0:@<10}".format("250","520")
@@@@@@@520250@@@@@@@

"{:+}{:-}".format("520","-205")#'+520 -205
#千分位分隔符
"{:,}".format(12345)#不能加""
"{:_}".format(12345)
#精度
"{:.2f}".format(3.1415)#3.14 保留两位小数
"{:.2g}".format(3.1415)#3.1 小数点前后一共有两位数
"{:.6}".format("who are you")#who ar 取字符串的前六位

7.2列表高级

7.2.1列表的遍历

a = [1,2,3,4,5,"唐伯虎点秋香"]
#列表的遍历
for each in a:
    print(each)
#通过 列表名[下标索引]来获取列表元素
print a[5]  #唐伯虎点秋香
7.2.2列表的切片

print(a[:3])
print(a[1:3])
print(a[2:])
print(a[::-1])   #将列表倒序
print(a[0:5:2])  #间隔为2,下标索引从0-5
print(a[:])  #打印全列表
7.2.3列表末尾追加元素使用 .append() 和 .extend()

a.append(59)
a.extend([6,19])#添加的是一个可迭代对象
a[len(a):] = [6]#使用切片在末尾添加
#使用inset()对指点位置插入元素
inset(索引,插入值)
a.insert(a[len(a)],33)#插入末尾
7.2.4删除替换元素

b = ["钢铁侠","灭霸","美国队长","绿巨人","奇异博士","黑豹"]
#   .remove()来删除元素
b.remove("钢铁侠")
#   .pop()删除指定位置元素
b.pop(2) #删除下标索引为2的元素
#   .clear()删除全列表

b[1] = "蜘蛛侠"  #灭霸替换为蜘蛛侠
b[3:] = ["武松","林冲","鲁智深"]  #替换从下标为3开始的元素
7.2.5使用 .sort()对列表进行排序(从小到大) .reverse() (从大到小)= .sort(reverse = True)
7.2.6嵌套列表

a = [[1,2,3],
     [4,5,6],
     [7.8,9]]
# [[1, 2, 3], [4, 5, 6], [7.8, 9]]

#嵌套列表遍历
for i in a:
    for each in i:
        print(each)

a[行索引][列索引]  #获取某一元素

x = [1,2,3]
y = [1,2,3]  #但x和y不一样,不是等价关系
7.2.7浅拷贝和深拷贝(得到两个独立的列表)

x = [[1,2,3],
     [4,5,6],
     [7,8,9]]
x[1][1] = 99
#通过.copy()和切片的方法来进行拷贝(处理一维列表)
y = x.copy()
y = x[:]
[[1, 2, 3], [4, 99, 6], [7, 8, 9]]#x
[[1, 2, 3], [4, 99, 6], [7, 8, 9]]#y


#使用.deepcopy()处理嵌套列表
import copy
y = copy.deepcopy(x)
[[1, 2, 3], [4, 99, 6], [7, 8, 9]]#x
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]#y
7.2.8列表推导式

a = [1,2,3,4,5]
for i in range(len(a))
    a[i] = a[i] * 2

a = [i * 2 for i in a]
# [2,4,6,8,10]     

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

x = [ i + 1 for i range(10)] 
x = []
for i in range(10):
    x.append(i + 1)

x = [[1,2,3],
     [4,5,6],
     [7,8,9]]
x = [row[1] for row in x]
#[2,5,8]
7.2.9嵌套列表

#创建一个嵌套列表
a = [0]
for i in range(3):
    a[i] = [0] * 3
print(a)
#[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
S = [a[0] * 3 for i in range(3)]

words = ["Fantastic","Great","Good","Company","Die","Service"]
select_wrod = [i for i in words if i[0] == "G"] 

7.3序列高级


a = [1,2,3,4,5,6]
del a[2]#根据下标删除元素
del a[::2]  #[2, 4, 6]
del x[:2]   #[3, 4, 5, 6]
#使用切片删除
x[1:4] = [] #[1, 5, 6]

a = [6,5,1,2,8,9,4,5]
b = sorted(a)
#sorted函数不会改变原来列表
print(b)  #[1, 2, 4, 5, 5, 6, 8, 9]
print(a)  #[6, 5, 1, 2, 8, 9, 4, 5]
#reversed 返回的是一个迭代器。将列表元素倒序,而不是从大到小排序
reversed(a)   #<class 'list_reverseiterator'>
print(list(reversed(a)))  #[5, 4, 9, 8, 2, 1, 5, 6]

#  enumerate()返回一个枚举对象
word = ["activate","reason","quiet","dumity"]
print(type(enumerate(word))) #<class 'enumerate'>
print(list(enumerate(word)))
#[(0, 'activate'), (1, 'reason'), (2, 'quiet'), (3, 'dumity')]
print(list(enumerate(word,10)))
#[(10, 'activate'), (11, 'reason'), (12, 'quiet'), (13, 'dumity')]

# zip()返回一个迭代器
a = [1,2,3]
b = [4,5,6]
c = [7,8,9,10]
print(zip(a,b))  #<zip object at 0x0000016ABA5BFD40>
print(list(zip(a,b)))#[(1, 4), (2, 5), (3, 6)]
print(list(zip(a,c)))#[(1, 7), (2, 8), (3, 9)] 优先最短列表
import itertools
print(list(itertools.zip_longest(a,b,c)))
#[(1, 4, 7), (2, 5, 8), (3, 6, 9), (None, None, 10)]

#map()返回一个迭代器
mapper = map(ord,"dsbshdhfb")
print(list(mapper))
mapper = map(pow,[1,2,3],[1,2,3]) #[1, 4, 27]
print(list(mapper))

#filter()返回一个由结果为真的元素组成的迭代器
list(filter(str.islower,"HjGUsjjha"))
#['j', 's', 'j', 'j', 'h', 'a']

迭代器vs迭代对象

迭代器只能操作一次,迭代对象可重复使用

iter()函数将迭代对象变为迭代器

next()函数可将迭代器中元素逐一提取

7.4字典高级

7.4.1创建字典的六种方法

a = {"云长":"关羽","翼德":"张飞","玄德":"刘备"}
a = dict(云长="关羽",翼德="张飞",玄德="刘备")
a = dict([("云长","关羽"),("翼德","张飞"),("玄德","刘备")])
a = dict({"云长":"关羽","翼德":"张飞","玄德":"刘备"})
a = dict(zip(["云长","翼德","玄德"],["关羽","张飞","刘备"]))
a = dict({"云长":"关羽","翼德":"张飞"},玄德="刘备")
7.4.2 字典的增删改查

#  formkeys(iterable,[,values])
a = dict.fromkeys("jadaasd",123)
#  {'j': 123, 'a': 123, 'd': 123, 's': 123}
a["b"] = 45
#  {'j': 123, 'a': 123, 'd': 123, 's': 123, 'b': 45}

# pop(key,[,default])
a.pop("j")
# popitem() 删除最后一个加入字典的键值对
a.popitem()

del a["b"]#删除指定元素
del a  #删除整个字典
a.clear()#清空字典中的所有元素

使用update()来增加多个键值对
a.update({"r":"157","p":"139"})
a.update(r="157",p="139")

使用get()方法来查字典中的键值对
a.get("i","找不到")
a.setdefault("i","code")
{'j': 123, 'a': 123, 'd': 123, 's': 123, 'b': 45, 'r': '157', 'p': '139', 'i': 'code'}

7.5集合高级(集合中元素无序且唯一)


#创建集合的三种方法
a = {"I","love","python",}
{s for s in "python"}  #{'y', 'n', 'p', 'o', 'h', 't'}
set("python“) #{'y', 'n', 'p', 'o', 'h', 't'}

.isdisjoint()  #来判断两集合是否相关
a.issubset(b)  #a是否是b的子集
a.issuperset(b) #a是否是b的超集
a.union(b) #求a与b的并集
a.intersection(b) #求a与b的交集
a.difference(b) #求a与b的差集(属于a但不属于b)
#################以上方法都支持多参数
a.symmetric_difference(b)#排除a,b集合共有的元素,其余元素组成的集合
7.5.1集合的增删改查

set() #创建的集合可变
frozenset() #创建的集合不可变
a = frozenset("njsjsdhv")
# frozenset({'n', 'j', 'h', 'd', 'v', 's'})

update()
s = set("xzcja")
s.update([1,1,2],"32")
print(s)

#通过以下方法来更新set()集合
intersection_update() #交集
difference_update() #差集
symmetric_difference_update() #排除a,b集合共有的元素,其余元素组成的集合
add("59")#将59作为字符串插入到集合,update("59")是将5和9分别插入集合

#删除元素
remove() #指定元素不存在,抛出异常
discrad() #指定元素不存在,静默处理
pop() #随机从集合中弹出一个元素
clear() #将集合清空
7.5.2字典的键和集合的元素是可哈希的,列表是可变的不能哈希

hash() #可获取一个对象的哈希值
#通过frozenset()创建嵌套集合
x = {1,2,3}
x = frozenset(x)
y = {x,4,5}
#{frozenset({1, 2, 3}), 4, 5}

8.函数

8.1创建和调用函数


def myfunc():
    pass

def myfunc(name):
    for i in range(3):
        print("my name is {}".format(name))

def myfunc(name):
    for i in range(3):
        print(f"my name is {name}")
myfunc("qqbb")

def div(x,y):
    if y == 0:
        return "除数不能为0!"
    else:
        return x/y
print(div(4,2))

8.2函数参数

8.2.1位置参数和关键字参数

def myfunc(o,v,s):
    return "".join((s,v,o))
myfunc(" python"," love"," I")
#关键字参数。位置参数必须在关键字之前
myfunc(o=" I",v=" love",s=" python")
 I love python
#可以在参数里面定义默认参数
def myfunc(o,v="吃",s="苹果"):
    return "".join((s,v,o))
print(myfunc("香蕉"))
8.2.2收集参数

#在形参中使用*起到打包效果
#收集参数可以打包为一个元组使用*
def myfunc(*args):
    print("有{}个参数".format(len(args))) #传入了多少个参数
    print(f"有{(len(args))}个参数")
def myfunc(*a,b,c):
    print(a,b,c)
myfunc(1,2,3,b=4,c=5)  #(1, 2, 3) 4 5

#收集参数可以打包为字典使用**
def myfunc(**kwargs):
    print(kwargs)
myfunc(a=1,b=2,c=3) #{'a': 1, 'b': 2, 'c': 3}

def myfunc(a,*b,**c):
    print(a,b,c)
print(myfunc(1,4,5,6,x=2,y=3)) #1 (4, 5, 6) {'x': 2, 'y': 3}

#在实参中使用*起到解包的效果
args = (1,2,3,4)
def myfunc(a,b,c,d):
    print(a,b,c,d)
myfunc(*agrs) #1 2 3 4

kwargs = {"a":"1","b":"2","c":"3","d":"4"}
myfunc(**kwargs) #1 2 3 4
8.2.3作用域

#局部作用域(局部变量),作用域仅限于该函数。
def mydef():
    x = 1968
    print(x)
mydef()  #1968
#全局作用域(全局变量)
x = 880
def myfunc():
    print(x)
myfunc() #880
#在函数中局部变量会覆盖同名的全局变量

#global()
x = 880
def myfunc():
    global x
    x = 1968
    print(x)
myfunc() #1968
print(x) #1968
8.2.4嵌套函数

def funA():
    x = 520
    def funB():
        x = 1314
        print("in funB x is ",x)
    funB()
    print("in funA x is ",x)
funA()
#in funB x is  1314
#in funA x is  520

#使用nonlocal语句,在内部函数中修改外部函数的作用域
def funA():
    x = 520
    def funB():
        nonlocal x
        x = 1314
        print("in funB x is ",x)
    funB()
    print("in funA x is ",x)
funA()
#in funB x is  1314
#in funA x is  1314
8.2.5 LEGB规则

Local 局部作用域

Enclosed 嵌套函数的外层作用域

Global 全局作用域

Build-In 内置作用域

8.3闭包


def funA():
    x = 880
    def funB():
        print(x)
    return funB
print(funA())  #<function funA.<locals>.funB at 0x0000013997761430>
print(funA()()) #880
***这儿很重要!!!!***
#作为外层函数的作用域(变量)会以某种形式保留下来
funny = funA()
funny()

def power(exp):
    def exp_of(base):
        return base ** exp
    return exp_of

square = power(2)
cube = power(3)

print(square(5)) #25
print(cube(5))   #125

#nonlocal()可以将嵌套函数的内层函数修改到外层的变量
def outer():
    x = 0
    y = 0
    def inner(x1,y1):
        nonlocal x,y
        x += x1
        y += y1
        print(f"现在,x={x},y={y}")
    return inner
move = outer()
move(1,2)
move(2,2)

import time
def time_master(func):
    print("开始运行程序")
    start = time.time()
    func()
    stop = time.time()
    print("该程序运行结束")
    print(f"该程序运行时间{(stop - start):.2f}秒。")

def myfunc():
    time.sleep(3)
    print("Hello world")

time_master(myfunc)

#开始运行程序
#Hello world
#该程序运行结束
#该程序运行时间3.01秒。

8.4装饰器(闭包+函数当参数)

8.5 lambda表达式(匿名函数)


lambda arg1,arg2,arg3,...,argnN : expression
def <lambda>(arg1,arg2,arg3,...,argN):
    return expression

def square(y):
    return y*y

square = lambda y : y * y

y = [lambda x : x * x,2,3]#lambda表达式可以放入列表内,普通函数不行
y[0](y[1])   #4
y[0](y[2])   #9

8.6生成器


def counter():
    i = 0
    while i <= 5:
        yield i
        i +=1        #此时counte是一个生成器<class 'generator'>
for i in counter():
    print(i)
8.6.1生成器表达式

t = (i ** 2 for i in range(10))
print(next(t))

一次只生成一个数据

8.7递归(函数调用自身的过程)


#迭代实现阶乘
def factIter(n):
    result = n
    for i in range(1,n):
        result *= i
    return result
print(factIter(5))
#递归实现阶乘
def factReter(n):
    if n == 1:
        return 1
    else:
        return n * factReter(n-1)
print(factReter(5))

#斐波那契数列(迭代的效率比递归高很多!!!!)
def fibIter(n):#迭代
    a = 1
    b = 1
    c = 1
    while n > 2:
        c = a + b
        a = b
        b = c
        n -= 1
    return c
print(fibIter(12))

def fibIter(n):#递归
    if n == 1 or n == 2:
        return 1
    else:
        return fibIter(n-1) + fibIter(n -2)
print(fibIter(12))

#编写函数文档(在函数最上面)
def exchange(dollar,rate = 6.23):
    """
    功能:美元转换人民币
    参数:
    -dollar美元数量
    -rate汇率
    :return:
    -人民币数量
    """
    return  dollar * rate

help(exchange)
exchange(dollar, rate=6.23)
    功能:美元转换人民币
    参数:
    -dollar美元数量
    -rate汇率
    :return:
    -人民币数量

8.8内省


函数名._annotations_  #来查看函数的类型注释
exchange._annotations_

8.9高阶函数(functools高阶函数库)


functools.reduce()函数
import functools
def add(x,y):
    return x + y
result = functools.reduce(add,[1,2,3,4,5])
print(result)

#10的阶乘  3628800
factorial = functools.reduce(lambda x,y:x*y,range(1,11))
print(factorial)
8.9.1偏函数

square = functools.partial(pow,exp = 2)
print(square(3))

cube = functools.partial(pow,exp = 3)
print(cube(3))
8.9.2 @wraps装饰器

#普通装饰器
import time
def time_master(func):
    def call_fun():
        start = time.time()
        print('开始调用函数了')
        func()
        stop = time.time()
        print(f"运行时间为{(stop - start):.2f}秒")
    return call_fun
@time_master
def myfunc():
    time.sleep(2)
    print("你演的夜色太美,你太温柔")
myfunc()
print(myfunc.__name__)  #call_fun

# @wraps装饰器用来修饰装饰器的装饰器
import functools
import time
def time_master(func):
    @functools.wraps(func)  #找到函数内调用的函数
    def call_fun():
        start = time.time()
        print('开始调用函数了')
        func()
        stop = time.time()
        print(f"运行时间为{(stop - start):.2f}秒")
    return call_fun

@time_master
def myfunc():
    time.sleep(2)
    print("你演的夜色太美,你太温柔")
myfunc()
print(myfunc.__name__) #myfunc

9.永久储存

9.1文件读写


#使用open()打开文件,write()写入内容、writelines()可以写入多个内容。
file = open("python.txt","r+")
file.write("《致橡树》\n")
file.writelines(['我如果爱你绝不学攀援的凌霄花\n','借你的高枝炫耀自己\n'])
file.close()
file.seek()  #修改文件指针(0指初始位置,1指当前位置,2指文件末尾)

9.2文件系统路径(pathlib)


from pathlib import Path
print(Path.cwd())
p = Path('F:\Python\python项目\DaydayUp')  #生成一个路径对象
#F:\Python\python项目\DaydayUp
q = p / "python.txt"  #使用 / 来拼接路径
print(q)
#F:\Python\python项目\DaydayUp\python.txt

p.is_dir()   #判断路径是否是文件夹
q.is_file()  #判断路径是否是文件
p.exists()   #判断路径是否存在
p.name       #获取路径的最后一部分
q.stem       #获取文件名
q.suffix     #获取文件后缀
q.parent     #获取其父级目录
q.parents    #获取逻辑祖先构成的一个不可变序列
ps = q.parents
for each in ps:
    print(each)
#F:\Python\python项目\DaydayUp\python.txt
#F:\Python\python项目\DaydayUp
#F:\Python\python项目
F:\Python
#F:\
q.parents还支持索引
q.parts      #将路径的各个组件拆分成元组
q.stat()       #查询文件或文件夹的信息
9.2.1 相对路径(以当前目录为基准一级一级推导)vs绝对路径(文件真正存在的路径)

./    表示当前目录
../   表示上一级目录
resolve() #将相对路径转化为绝对路径
iterdir() #获取当前路径下的所有文件和文件夹
print(type(p.iterdir()))  #<class 'generator'>
for each in p.iterdir():
    print(each)
print([i for i in p.iterdir() if i.is_file()])  #列表推导式,筛选出所有是文件
#[WindowsPath('F:/Python/python项目/DaydayUp/demo_1.py'), WindowsPath('F:/Python/python项目/DaydayUp/demo_2.py'), WindowsPath('F:/Python/python项目/DaydayUp/demo_3.py'), WindowsPath('F:/Python/python项目/DaydayUp/demo_4.py'), WindowsPath('F:/Python/python项目/DaydayUp/extractScript.py'), WindowsPath('F:/Python/python项目/DaydayUp/lalala.py'), WindowsPath('F:/Python/python项目/DaydayUp/python.txt'), WindowsPath('F:/Python/python项目/DaydayUp/test.py')]
mkdir()   #创建文件夹
rmdir()   #删除文件夹
unlink()  #删除文件

p = Path(.)
p.glob("*.txt") #在当前目录下查询所有.txt文件,返回一个对象。
list(p.glob("*.txt"))

9.3 with语句和上下文管理器


with open ("python.txt","r+") as f:
    f.writelines(["我如果爱你\n","绝不学痴情的鸟儿为绿荫重复单调的歌曲\n"])

#pickle 永久储存python对象
import pickle
x,y,z = 1,2,3
s = "qqppla"
l = ["潜入海底",3.14,15926]
d = {'0':'张飞','1':'绣花','2':'真不错'}
with open('data.pkl','wb') as f:
    pickle.dump((x,y,z,s,l,d),f)   #将obj对象序列化存入已经打开的file中
    pickle.dumps()                 #将obj对象序列化为string形式,而不是存入文件中


with open('data.pkl','rb') as f:
    (x,y,z,s,l,d)= pickle.load(f)  #将file中的对象序列化读出
    print(x,y,z,s,l,d,sep="\n")    

1
2
3
qqppla
['潜入海底', 3.14, 15926]
{'0': '张飞', '1': '绣花', '2': '真不错'}

10.异常


#使用try except来捕获异常
try:
    测试范围
except [expression [as identifier]]:
    异常处理代码

try :
    0/1
    7788 + "qqppla"
except(ZeroDivisionError,TypeError,ValueError):
    pass

#try except else(发生异常执行except内容,没发生异常执行else内容)
try :
    0/1
except():
    print("逮到了")
else:
    print("没逮到")
#try except finally(无论异常是否发生都会执行finally内容)

10.1异常的嵌套


try :
    try :
        1/0
    except:
        print("内部异常")
    520 + "qqppla"
except:
    print("外部异常")
finally:
    print("收尾工作")

内部异常
外部异常
收尾工作

11.类和对象


#对象 = 属性(静态特征) + 方法(对象所能做的事)
class Person:
    head = 1
    eyes = 2
    legs = 2
    finger = 10
#每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
    def eat(self): 
        print("人可以吃驴肉火烧")
    def drink(self):
        print("可以喝可口可乐")
    def run(self):
        print("可以跑马拉松")
    def play(self):
        print("可以打打篮球")
p = Person()
p.play()

11.1封装(通过类将对象的相关属性和方法打包到一起)

11.2继承(继承一个类可以使用该类的属性和方法)


class A():
    x = 520
    def today(self):
        print("今天是个好日子")
class B(A):
    pass
b = B()
b.today()  #今天是个好日子
#A是B的父类

isinstance() #判断一个对象是否属于某一个类
issubclass() #检测一个类是否是某个类的子类

#多重继承:一个子类可以继承多个父类
class A():
    x = 520
    def today(self):
        print("今天是个好日子")
class B():
    x = 7788
    y = 1978
    def today(self):
        print("今天要下雨了")
#类的多重继承顺序是从左到右,且在当前类查不到属性和方法再去下一个类中查找
class C(A,B):
    pass
c = C()
print(c.x)
c.today()
print(c.y)
520
今天是个好日子
1978

#组合
class cat:
    def say(self):
        print("喵喵喵喵")
class dog:
    def say(self):
        print("汪汪汪汪")
class pig:
    def say(self):
        print("哼哼哼哼")
class garden:
    c = cat()
    d = dog()
    p = pig()
    def say(self):
        self.c.say()  #self实例对象和类的方法绑定!!!!
        self.d.say()
        self.p.say()
g = garden()
g.say()

#利用空类生成的实例来模拟字典
class C:
    pass
c = C()
c.x = "七七八八啦"
c.y = 520
c.z = [1,2,3,4]

###__init__() 构造函数
class C:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def add(self):
        return self.x + self.y
    def mul(self):
        return self.x * self.y
c = C(2,3)
print(c.add())  #5
print(c.mul())  #6

#重写(对父类的某个属性或方法不满意的话,可以重写同名的属性进行覆盖)
class D(C):
    def __init__(self,x,y,z):
        C.__init__(self,x,y)
        self.z = z
    def add(self):
        return C.add(self) + self.z
    def mul(self):
        return C.mul(self) * self.z
d =D(2,3,5)
print(d.add())   #10
print(d.mul())   #30

#钻石继承
class A:
    def __init__(self):
        print("我是A")
class B1(A):
    def __init__(self):
        A.__init__(self)
        print("我是B1")
class B2(A):
    def __init__(self):
        A.__init__(self)
        print("我是B2")
class C(B1,B2):
    def __init__(self):
        B1.__init__(self)
        B2.__init__(self)
        print("我是C")

c = C()
我是A
我是B1
我是A
我是B2
我是C

#调用super()函数来解决钻石继承问题
#super()严格遵循MRO顺序
#C.mro()
class A:
    def __init__(self):
        print("我是A")
class B1(A):
    def __init__(self):
        super().__init__()
        print("我是B1")
class B2(A):
    def __init__(self):
        super().__init__()
        print("我是B2")
class C(B1,B2):
    def __init__(self):
        super().__init__()
        print("我是C")

c = C()
我是A
我是B2
我是B1
我是C

#Mixin  添加某个功能后期加上去的父类
class Animal:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def say(self):
        print(f"我叫{self.name},我今年{self.age}岁了")
class FlyMixin:
    def fly(self):
        print("我还可以飞飞")
class Pig(FlyMixin,Animal):
    def call(self):
        print("我是一只特立独行的猪")
p = Pig("七七八八啦",3)
p.call()    #我是一只特立独行的猪
p.say()     #我叫七七八八啦,我今年3岁了
p.fly()     #我还可以飞飞

test


class Display():
    def display(self,message):
        print(message)
class LoggerMixin:
    def log(self,message,file_name = "llla.txt"):
        with open(file_name,"a") as f:
            f.writelines(message)
    def display(self,message):
        super().display(message)
        self.log(message)
class MySubclass(LoggerMixin,Display):
    def log(self,message,):
        super().log(message,file_name="qqbb.txt")
subclass = MySubclass()
subclass.display("This is s test")

print(MySubclass.mro())

#[<class '__main__.MySubclass'>, <class '__main__.LoggerMixin'>, <class '__main__.Display'>, <class 'object'>]

11.3多态


Square\circle\Triangle重写了构造函数和area()方法,此之谓多态
class Shape:
    def __init__(self,name):
        self.name = name
    def area(self):
        pass
class Square(Shape):
    def __init__(self,length):
        super().__init__("正方形")
        self.length = length
    def area(self):
        return self.length * self.length

class Circle(Shape):
    def __init__(self,radius):
        super().__init__("圆形")
        self.radius = radius
    def area(self):
        return 3.14 * self.radius * self.radius

class Triangle(Shape):
    def __init__(self,base,height):
        super().__init__("三角形")
        self.base = base
        self.height = height
    def area(self):
        return self.base * self.height / 2

s=Square(5)
c=Circle(5)
t=Triangle(6,3)

print(s.name)     #正方形
print(s.area())   #25

class Cat():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def intro(self):
        print(f"我是一只小猫,我的名字是{self.name},我今年{self.age}岁了")
    def say(self):
        print("喵喵喵喵")
class Dog():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def intro(self):
        print(f"我是一只修狗,我的名字是{self.name},我今年{self.age}岁了")
    def say(self):
        print("汪汪汪汪")
class Pig():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def intro(self):
        print(f"我是一只大猪,我的名字是{self.name},我今年{self.age}岁了")
    def say(self):
        print("哼哼哼哼")
c = Cat("阿拉蕾",3)
d = Dog("阿斯顿",5)
p = Pig("白菜",2)
def animal(x):
    x.intro()
    x.say()

animal(p)

#我是一只大猪,我的名字是白菜,我今年2岁了
#哼哼哼哼

11.4私有变量(通过某种手段使对象里的某种属性和方法没法被外部访问)


name mangling(在变量或函数前面加上__)
class C:
    def __init__(self,x):
        self.__x = x
    def set(self,x):
        self.__x = x
    def get(self):
        print(self.__x)
c = C(250)
c.set(520)
c.get()
print(c.__dict__)  #{'_C__x': 520}

#__slots__来避免创造字典产生的空间浪费
class C:   #类C中只有x、y两种属性且已经规定死,不可以动态添加属性!!!!!
    __slots__ = ['x','y']
    def __init__(self,x):
        self.x = x

c = C(550)
print(c.x)
c.z = 666  #AttributeError: 'C' object has no attribute 'z'
#继承父类的__slots__属性不会在子类中生效!!!!
class D(C):
#C是D的父类且C类中有__slots__,但可以在D类中实现动态添加属性,存在__dict__!!!!

11.5魔法方法


#对象的诞生流程是先调用__new__()方法
class CapStr(str):
    def __new__(cls, string):
        string = string.upper()
        return super().__new__(cls,string)
cs = CapStr("dog")
print(cs)   #DOG
#对象销毁的时候会调用__del__()方法(当一个对象没有任何引用的时候才会被销毁)
class C:
    def __init__(self):
        print("我来啦")
    def __del__(self):
        print("我走啦")

c = C()   #我来啦
del c     #我走啦

#利用__del__()方法实现对象的重生

 11.6属性访问

class C():
    def __init__(self,name,age):
        self.name = name
        self.__age = age#私有变量

c = C("怪然",18)
# hasattr用来检测C是否有name这个属性
print(hasattr(c,"name"))
# getattr是用来获取某个属性值
print(getattr(c,"name"))
#使用"_类名__属性 "来得到私有变量
print(getattr(c,"_C__age"))
#setattr是用来设置指定属性的值
setattr(c,"_C__age",19)
print(getattr(c,"_C__age"))
# delattr是用来删除类的属性
delattr(c,"name")
class C:
    def __getitem__(self, index):
            print(index)
c = C()
c[2:8]   #slice(2, 8, None)切片操作相对于是slice的语法糖

s = "Apple Like Banana"
print(s[2:6])
print(s[slice(2,6)])
s[7:]
s[slice(7,None)]
s[::4]
s[slice(None,None,4)]
class Double:
    def __init__(self,start,stop):
        self.value = start - 1
        self.stop = stop
    #定义__iter__(self)说明该类是一个可迭代对象
    def __iter__(self):
        return self
    # 可迭代对象定义__next__(self)说明该类是一个迭代器
    def __next__(self):
        if self.value == self.stop:
            raise StopIteration
        self.value += 1
        return self.value * 2
d = Double(1,8)
for i in d:
    print(i,end=' ')   #2 4 6 8 10 12 14 16 
class Power:
    def __init__(self,exp):
        self.exp = exp
    # *是指位置参数  **是指关键字参数
    #def __call__(self, *args, **kwargs):
    def __call__(self, base):
        return base ** self.exp
square = Power(2)
cude = Power(3)

print(square(3))
print(cude(4))

 11.7property()函数

优势1:简化代码,避免复杂的魔法三件套

优势2:property函数的参数是函数,相对于装饰器。

class C:
    def __init__(self):
        self._x = 250
    def getx(self):
        return self._x
    def setx(self,value):
        self._x = value
    def delx(self):
        del self._x
    x = property(getx,setx,delx)

c = C()       
print(c.x)                 #250 
print(c.__dict__)          #{'_x': 250}
class D:
    def __init__(self):
        self._x = 250
    @property
    def x(self):
        return self._x
    @x.setter
    def x(self,value):
        self._x = value
    @x.deleter
    def x(self):
        del self._x
d= D()                       
print(d.x)                 #250
print(d.__dict__)          #{'_x': 250}
del d.x                    #{}
print(d.__dict__)    

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值