Python语法笔记(云端存个档,活用Ctrl+F)

一、字符串独有用法

1.判断开头.startswith

v1.startswith("北京市")#判断v1是否以‘北京市’开头

2.判断结尾.endswith

v1.endswith("羊村")#判断v1是否以‘羊村’结尾

3.判断是否整数.isdecimal

v1.isdecimal()#判断字符串v1是否是纯整数
  #无法对①这样的进行排除"①".isdigit()判定为true

4.去除两(单左右)边空白或特定值.(lr)strip

v1.strip()#去除两边空白,换行符,制表符,lr表示仅去左右
v1.lstrip()
v1.rstrip()
#若()填入"xx"表示去除指定的内容
a1="  111  ".lstrip()
print(a1)

5.大小写转换.upper,lower,title

v1.upper()#全大写
v1.lower()#全小写
v1.title()#每个单词首字母大写


v1.swapcase()#小改大以及大改小
v1.capitalize()#s[0]改为大写

6.内容替换.replace

#其实对于列表也适用
v1.replace("CNM","***")#脏话屏蔽

#评论过滤
char_list={"CMN","CNM","nmsl"}
content=input("请输入评论内容")
for keyword in char_list:
    content=content.replace(keyword,"**")
print(content)


7.字符串切割.®split

v1.split(",")#以“,”为切割标准

#判断用户密码是否正确
info="root,123"
user_list=info.split(",")

user=input("输入用户名")
pwd=input("输入密码")
if user==user_list[0] and pwd==user_list[1]:
    print("正确")
else:
	print("失败")
    
#控制切几个
data="111,222,333"
v1=data.split(",",1)#只切第一个
print(v1)

#从右边开切,最常用的可以用来判别文件类型
address="c/user/desktop/x.yy/1.txt"
v1=address.rsplit(".",1)#只切右边第一个
if v1[-1]=="txt":
    print("文本")
else:     
	print("非文本")
    

8.基于.join的字符串拼接

data_list=["1","2","3"]
v1="<".join(data_list)
print(v1)#1<2<3

9.字符串格式化.format

name="{}喜欢{},还有{}"
#{}内缺省则默认按照012顺序
data=name.format("我","尼亚","大家")
print(data)

name="{i}喜欢{her},还有{them}"
data=name.format(i="我",them="大家",her="尼亚")
print(data)

10.字符串存储为字节类型encode

data="123abc你我他"#unicode形式存储
v1=data.encode("utf-8")#编码
v2=v1.decode("utf-8")#解码

11.字符串居中居左居右

print("YJJ".center(21,"*"))#总共21字符,以*填充 YJJ居中
"YJJ".ljust(21,"*")
"YJJ".rjust(21,"*")

12.输入str以此跳转源码查看字符串独有功能

13.字符串测试函数与字符串搜索函数表

函数名何时返回True
s.endswith(t)s以字符串t结尾
s.startswith(t)s以t结尾
s.isalnum()s只包含字母、数字
s.isalpha()s只包含字母
s.isdecimal()s只包含十进制数字的字符
s.isdigit()s只包含数字字符
s.isidentifier()s是合法的标志符
s.islower()s只包含小写字母
s.isnumeric()s只包含数字
s.isprintale()s只包含可打印的字符
s.isspace()s只包含空白字符
s.istitle()s大小写符合头衔要求的
s.isupper()s只包含大写字母
t in ss包含字符串t
函数名返回值
s.find(t)如果没有找到t返回-1,否则返回第一个t在s的起始位置
s.rfind(t)和上述一样,但从右搜索
s.index(t)同find,但找不到则引发ValueError异常
s.rindex(t)同上,从右搜索

二、字符串公共功能

1.+号实现拼接

2.*号实现复制

data="发癫"
v1=data*3

3.长度len(data)

data="发癫"
value=len(data)
print(value)

4.索引message[]

#字符串类似于元组,只能检索到不能检索后修改
message="mio, wo de mio, mei you ni wo ke ze me huo a"
length=len(message)-1
while length>=0:
    print(message[length])
    length-=1
#倒序输出

5.切片[:]

#切片最右值不取
message="012345"
print(message[0:2])#s输出01
print(message[:-1])#取到到处第二个截止,不取后

6.步长(负数可倒序输出)[::1]

message="012345"
print(message[::-1])#543210
print(message[::-2])

7.for,while循环(搭配range)

range(2,4,1)#以步长1输出23,前取后不取
range(10)#从,输出0-9
#break 终止当前层循环
#continue 终止本次循环 

三、列表独有功能

1.追加.append

list=range(10)
l=[]
for item in list:
    l.append(item)
print(l)

2.批量追加.extend(配合range)

l=[]
l.extend(range(10))
print(l)#快速批量添加(本质上就是循环传入的每个元素)

#比如我有一个字符串"yjj",想要把字符串每个字母单独添加进去
l=[]
a="yjj"
for item in a:
    l.append(item)
print(l)
#简单的:
l1=[]
l1.extend(a)

3.指定位置插入.insert

list=["1","2","3","4"]
list.insert(-1001,"0")
print(list)#索引大于列表长度则放入最右,小于长度相反数则放最左

4.删除,清空.remove .pop .clear

#remove删除指定内容一次删一个,没有则报错
list=["yjj","yjj","yjj","y"]
while True:
    if "yjj" in list:
        list.remove("yjj")
    else:
        break
print(list)

#pop默认弹出最后一个,指定为索引位置
list=["yjj","yjj","yjj","y"]
a=list.pop(0)
 

5.根据值找索引.index

list=["yjj","yjj","yjj","y"]
a=list.index("yjj")
print(a)

6.排序.sort sorted()

#本质是用unicode大小排序,可排序任意类型,查询用ord指令。
#v1=ord("y")
list1=[1,234,2,4,2243,1234,241]
list1.sort()#从小到大
print(list1)
list1.sort(reverse=True)#从大到小
print(list1)

#用sorted()不改变原列表,但返回的是迭代器地址,需要list(),和下面reversed相同
list1=[1,234,2,4,2243,1234,241]
a=list(sorted(list1))
print(a)
print(list1)
#仍然可以传递(reverse=True)来从大到小排序

'''sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

sort 只是应用在 list 上的方法(就地排序无返回值)。

sorted 是内建函数,可对所有可迭代的对象进行排序操作,(返回新的list)。

list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
'''

7.反转.reverse reversed()

list1=[1,234,2,4,2243,1234,241]
list1.reverse()
print(list1)

#不改变原列表
list1=[1,234,2,4,2243,1234,241]
a=reversed(list1)
print(list1)
print(a)#<list_reverseiterator object at 0x0000025776D10760>...据说输出的是迭代器地址?需要用list()方能输出结果
a1=list(a)
print(a1)

四、列表公共功能

1.列表相加相乘

#+ *分别是拼接和copy

2.包含in 和not in

if item in listif item not in list

3.len长度

list1.len()

4.索引,可以读改删

#(建议配合for range使用)如:
list=[1,2,3]
for index in (range(len(list))):
    print(index,list[index])
#字符串也可以索引
user_list=[1,2,3]
print(user_list[0])
user_list[1]=1
del user_list[2]
print(user_list)
user_list.pop(1)
print((user_list))
user_list.remove(1)
print(user_list)

#有一个坑,如果按照某个条件删除,按照索引做循环的时候那么前面删除的会导致索引错误
user_list=["YJJ","JJY","YYY","YYJ","JJJ","YYYY"]
for item in user_list:
    if item.startswith("Y"):
        user_list.remove(item)
print(user_list)
#正确应该如下,倒着去索引
user_list=["YJJ","JJY","YYY","YYJ","JJJ","YYYY"]
for index in range(len(user_list)-1,-1,-1):
    item=user_list[index]
    if item.startswith("Y"):
        user_list.remove(item)
print(user_list)

4.嵌套

#存在嵌套索引
a=["abc",789,111]
print(a[0][1])#输出b
#切记哪怕在嵌套中,字符串依然无法修改,即创建了一个新的字符串,也就是说在列表里操作字符串仍然要用赋值
b=a[0].upper()
a[0]=b
print(a)

#或者a[0]=a[0].upper

五、集合独有功能

1.添加.add

data=set()
data.add("yjj")

2.删除.discard

data={"yjj",1}
data.discard(1)
print(data)

3.交集并集差集

#交集&,并集|,差集-

六、集合公共功能

1.长度len()

2.无索引

3.类型转换

v1="YJJ"
v2=set(v1)
print(v2)#"挨着输出Y,J,J"

#列表去重常用

4.集合元素以哈希表存储,所以必须是可哈希的,且查找很快

#list,set不可哈希
#所以在列表嵌套列表时候,转换成集合会报错
类型是否可变是否有序元素要求是否可哈希转换定义空
listlist(其他)v=[];v=list()
tupletuple(其他)v=();v=tuple()
set可哈希set(其他)v=set()
dict键可哈希,值随意(但值如果是集合,那也应该遵循集合的可哈希)dict(其他)

七、字典独有功能

1.根据键获取值.get()

info={"age":1,
    "status":True,
    "name":"YJJ"}
data1=info.get("name")
data2=info.get("email")#不存在返回None
print(data1,data2)

2.获取键.keys()

#py2得到的是键的列表,而3是得到高仿列表(用于节省内存),可通过list转
info={"age":1,
    "status":True,
    "name":"YJJ"}
for ele in info.keys():
    print(ele)
if "age" in info.keys():
    print(1)
else:
    print(0)

3.获取值.values()

#同2中的键

4.获取键值对应关系.items()

#输出的是元组,item是(键,值)
info={"age":1,
    "status":True,
    "name":"YJJ"}
for item in info.items():
    print(item[0],item[1])	
    #age 1
	#status True
	#name YJJ
    
    #print(item)
    #('age', 1)
	#('status', True)
	#('name', 'YJJ')
for key, value in info.items():
    print(key,value)

5.设置(新增)值.setdefault()

#如果键存在则无事发生,不存在则新增
info={"age":1,
    "status":True,
    "name":"YJJ"}
info.setdefault("age",18)
info.setdefault("a","b")
print(info)

6.更新键值对.update()

#如果键存在则更新,不存在则新增,注意书写格式和上条不同
info={"age":1,
    "status":True,
    "name":"YJJ"}
info.update({"age":18})
info.update({"a":"b"})
print(info)

7.移除.pop()

info={"age":1,
    "status":True,
    "name":"YJJ"}
data=info.pop("age")
print(data)#输出弹出的值

8.按顺序移除,后进先出.popitem()

info={"age":1,
    "status":True,
    "name":"YJJ"}
data=info.popitem()
print(data)#输出弹出的键和值

八、字典公共功能

1.并集|(python3.9以后)

#类似于update,区别在于得到新的字典
v1={"k1":1,"k2":2}
v2={"k2":3,"k3":5}
v3=v1|v2
print(v3)#{'k1':1,'k2':3,'k3':5}

2.长度len()

3.索引(即使在py3中也不能通过数字取值,而是键)

#和get相似,但不存在则会报错
v1 = {"k1": 1, "k2": 2}
print( v1['k1'] )
# print(v1["k5"])

4.增加,删除del

#新增类似于update
v1 = {"k1": 1, "k2": 2}
v1["k3"]="333"
print(v1)

#没有则报错
v1 = {"k1": 1, "k2": 2}
del v1["k1"]
print(v1)

5.for循环

6.转换

v=dict([["k1","v1"],["k2","v2"]])
print(v)

九、文件操作

1.读文件"wb",“wt”

#判断路径是否存在
import os
file_path='C:/Users/YJJ/Desktop/pythonProject/1.txt'
exists=os.path.exists(file_path)
if exists:
    print(exists)
#编码和解码
name="YJJ"
data=name.encode('utf-8')#编码
print(data)
a=data.decode('utf-8')
print(a)#解码
'''
#1.打开文件
file_object=open('1.txt',mode="rb")#第一个参数相对地址,也可使用绝对地如:
'C:/Users/YJJ/Desktop/pythonProject/1.txt'
#2.读取文件内容,赋值给data
data=file_object.read()
#3.关闭文件
file_object.close()
print(data)#二进制
#解码
text=data.decode('utf-16')
print(text)
'''

#简单的做法
file=open( 'C:/Users/YJJ/Desktop/pythonProject/1.txt',mode='rt',encoding='utf-16'
)
file_read=file.read()
print(file)
print(file_read)

2.写文件"rb",“rt”

'''
#1.打开文件
file_object=open('1.txt',mode="wb")#第一个参数相对地址,也可使用绝对地如:
'C:/Users/YJJ/Desktop/pythonProject/1.txt'
#2.读取文件内容,赋值给data
file_object.write("YJJ".encode('utf-8'))
#3.关闭文件
file_object.close()
'''

#简单做法
file_object=open('1.txt',mode="wt",encoding='utf-8')
file_object.write("111")#必须字符串,否则报错
file_object.close()

3.打开模式分析’r,w,x,a’ ‘t,b’ ‘+’ (包括光标位置)

  • 只读:r,rt,rb

    • 存在,读
    • 不存在,报错
    • r=rt,需要注意设定编码,没有默认为utf-8
  • 只写:w,wt,wb

    • 存在,清空再写
    • 不存在,创建报错
  • 只读:x,xt,xb

    • 存在,报错
    • 不存在,创建再写
  • 只写:a,at,ab

    • 存在,尾部追加
    • 不存在,创建再写
  • 读写:+(取决于光标位置)

    • r+=rt+,默认光标位置写,注意是覆盖写,如果先写后读,光标位置在文本首,使得最开始内容被覆盖

    • w+=wt+,光标位置在起始位置,因为会清空文件。所以最开始读为空,先写由于光标始终后移,所以依然读不到,可利用如下语句

      file_object.seek(0)
      #将光标位置移动到起始,注意数字是指字节数,utf-8三字节一个汉字,注意乱码且对于a无效,a每次都是移到最后写
      
      #显示光标位置
      f.tell()
      
    • a+=at+,打开后光标在最后,且不管怎么移动。写之前总会移动到最后

4.以行为单位读.read() .readline()

#t模式读字符,b读字节
f=open('1.txt',mode="rt",encoding='utf-8')
data=f.read(1)#读一个字符
print(data)


#.readline()一行一行的读,只读第一行但不太方便,

#.readlines()一行一行读,形成列表,每一行一个元素

#想要一行一行输出
f=open('1.txt',mode="rt",encoding='utf-8')
for line in f:
    print(line.strip())#本身换行以及循环给了一个换行
f.close

5.将缓冲区刷到硬盘

#写到缓冲区,不定时转移到数据大量数据更新不及时,则可用.flush()
f=open('1.txt',mode="at",encoding='utf-8')
while True:
    f.write("YJJ")
    f.flush()
f.close()

6.with open

with open('1.txt',mode="at",encoding='utf-8') as f:

7.文件分割实例(copy某大佬的,具体链接忘了)

import os

sourceFileName = "1.txt"  # 定义要分割的文件


def cutFile():
    print("正在读取文件...")
    sourceFileData = open(sourceFileName, 'r', encoding='utf-8')
    ListOfLine = sourceFileData.read().splitlines()  # 将读取的文件内容按行分割,然后存到一个列表中
    n = len(ListOfLine)
    print("文件共有" + str(n) + "行")
    print("请输入需要将文件分割的个数:")
    m = int(input(""))  # 定义分割的文件个数
    p = n // m + 1
    print("需要将文件分成" + str(m) + "个子文件")
    print("每个文件最多有" + str(p) + "行")
    print("开始进行分割···")
    for i in range(m):
        print("正在生成第" + str(i + 1) + "个子文件")
        destFileName = os.path.splitext(sourceFileName)[0] + "_part" + str(i) + ".log"  # 定义分割后新生成的文件
        destFileData = open(destFileName, "w", encoding='utf-8')
        if (i == m - 1):
            for line in ListOfLine[i * p:]:
                destFileData.write(line + '\n')
        else:
            for line in ListOfLine[i * p:(i + 1) * p]:
                destFileData.write(line + '\n')
        destFileData.close()
    print("分割完成")


if __name__ == "__main__":
    cutFile()
# -*- coding: utf-8 -*-

# 按照大小分割文件

import os

filename = "1.txt"  # 需要进行分割的文件,请修改文件名
size = 80000  # 分割大小约80K


def mk_SubFile(srcName, sub, buf):
    [des_filename, extname] = os.path.splitext(srcName)
    filename = des_filename + '_' + str(sub) + extname
    print('正在生成子文件: %s' % filename)
    with open(filename, 'wb') as fout:
        fout.write(buf)
        return sub + 1


def split_By_size(filename, size):
    with open(filename, 'rb') as fin:
        buf = fin.read(size)
        sub = 1
        while len(buf) > 0:
            sub = mk_SubFile(filename, sub, buf)
            buf = fin.read(size)
    print("ok")


if __name__ == "__main__":
    split_By_size(filename, size)

8.excel操作

#pip install openpyxl

from openpyxl import load_workbook as lw
wb=lw("1.xlsx")
#1.获取所有sheet名称,并选择行列
print(wb.sheetnames)
sheet=wb["xxxx"]#选择sheet名称,索引位置也可,如:
#sheet=wb.worksheets[0]
cell=sheet.cell(1,2)#第一行第二列,返回的是元组,此语句等价于:
#cell=sheet['A2']
print(cell.value)#文本信息
#cell.style
#cell.font
#cell.alignment

#3.第N行所有单元格
for cell in sheet[1]:
    print(cell.value)
#4.所有行
for row in sheet.rows:
    print(row[0].value,row[1].value)
#5.所有列
for col in sheet.columns:
    print(col[0].value,col[1].value)

十、函数

1.基本结构

def func(arg):
    pass

name()

2.参数

def get_lsit(aaa):
    v=[11,22,33,44]
    print(v[aaa])

get_lsit(1)

3.返回值

#函数一旦遇到return,则后续不执行

def func(arg):
    #pass
    return 9#默认return None

val=func('aasdasda')#val=9

#统计A个数
def get_char_count(data):
    sum_counter = 0
    for i in data:
        if i == "A":
            sum_counter += 1

    return sum_counter
a = get_char_count('aADAFAAFAF')
print(a)

4.函数实例

# 1.判断列表数字个数
def num(number):
    count = 0
    for i in number:
        if type(i) == int:#判断是否是数字
            count += 1
    return count

print(num([1, 1312, 11, 'ddff', 'wfew']))


5.传参可设置默认值

def func(a1,a2=9):
    pass
#不传默认为9,且位置传参关键字传参在位置传参后面

func(1,a2=1)#可
func(a1=1,8)#不可

6.函数参数*,**表示可变的参数个数生成元组,字典

def func(*args):#规范写法
    print(a1)
#*只支持位置传参
func(1)
func(1,2)
func((11,22,33))
func(*(111,222,333))
# (1,)
# (1, 2)
# ((11, 22, 33),)
# (111, 222, 333)输出元组


def func(**kwargs):
    print(kwargs)

func(k1=1,k2="YJJ")

#输出字典{'k1': 1, 'k2': 'YJJ'}
func(**{'k1':1, 'k2': 'YJJ'})

7.作用域

#python以函数为一个单独作用域
#作用域查找规则:优先在自己查找,自己没有再去父级找,直至找到全局,全局没有就报错

def func():
    x=9
    print(x)
print(x)#报错

#子作用域只能查找父作用域的内容,不能重新赋值
#非要赋值,需要  global x
name=[111,23,34]
def func():
    global name
    name=1
func()
print(name)
,使用
#或者修改上一级 nonlacal x

8.函数赋值,融入列表,集合,字典中等

def func():
    print(1)
v1=func
v1()

func_list=[func,func,func]
func_list[1]()

9.lambda表达式 λ(偷懒的函数定义,可结合map,filter,reduce使用),又称匿名函数

def func(a1,a2):
    return a1+a2

func2=lambda a1,a2:a1+a2
#默认会返回a1+a2

10、内置函数

1.进制转换

#abs()绝对值

#divmod(a,b)返回两数商和余数
x,y=divmod(1001,5)
print(x,y)#200 1

#bin()十转二0b1111
#oct()十转八0o7777
#hex()十转十六0xAAAA
#int()其他转十
v1="0o1101"
result=int(v1,base=8)

2.编码相关

#chr()将某个十进制转化成unicode编码中对应的字符串
#ord()上述反之

3.随机

import random
random.randomint(1,3)#1到3中随机

4.map()输入x,输出x+100

#map(lambda,v1)第二个参数是可迭代的(可以for循环的),第一个是函数。循环第二个参数然后将返回值添加到一个列表中。不影响原参数的值,只是循环。

#py2中map会返回这个列表,而py3中则会返回一个可迭代对象,(大致意思是map没有立刻运行,以起到节省内存作用(也许是调试方便点?存疑)),用list()可以转换这个参数
v1=[11,22,33,44]
print(map(lambda x:x+1000,v1))
#py3结果<map object at 0x0000016231E46AF0>
#py2结果[1011, 1022, 1033, 1044]

print(list(map(lambda x:x+1000,v1)))
#py3结果[1011, 1022, 1033, 1044]

5.filter()输入x,输出筛选过的x(根据返回值T或F)

v1 = [11, 22, 33, 44, "adafdaf"]
print(list(filter(lambda x: type(x) == int, v1)))
#已经有TF返回值了,等价于
print(list(filter(
    lambda x: True if type(x) == int else False, v1)
          )
     )

6.reduce()输入x,输出x中元素操作后得到的返回值

#reduce需要两个参数,初始是x的一二个元素,第二次迭代是上一次迭代返回值和下一次进行运算
import functools as ft

v1 = [1, 2, 3, 4, 5, 6]
print(ft.reduce(lambda x, y: x + y, v1))

十一、装饰器(另有带参数的,暂时跳过)

#装饰器目的是在不修改原函数内部代码的基础上,做一些小修补

#标准格式为
def func(arg):#arg为被装饰的函数
    def inner():
        print("before index")
        #修饰index执行前
        
        v=arg()
        
        print("after index")
         #修饰index执行
        return v
    return inner

@func
#@执行index=func(index)
def index():
    print("123")
    return 666
index()

#例如我们想用来计算函数运行时间
import time

def delta(arg):
    def inner():
        print("before index")
        #修饰index执行前
        strat_time=time.time()
        v=arg()
        end_time=time.time()
        print(end_time-strat_time)
        print("after index")
         #修饰index执行
        return v
    return inner

@delta
def index():
    print("123")
    time.sleep(2)
    return 666
index()

十二、迭代器

1.列表等转换成迭代器

v1 = [1, 2, 3]
v2 = iter(v1)#转换成可迭代对象,或v1.__iter__()
while True:
    try:
        val = v2.__next__()  # 或者next(v2)
        print(val)
    except Exception as e:
        break
  

十三、生成器

1.类似于函数的变种,函数内部包含yield

def func():
    print("第一次")
    yield 2#返回2
    print("第二次")
    yield 3
    print("第三次")
    yield 100
    print("第四次")


# 函数内部代码不会执行。返回一个生成器对象
v1 = func()
# 生成器是可以被for循环的,一旦开始循环内部代码开始执行

for item in v1:
    print(item)#输出返回值

#存在yield该函数是生成器函数,调用生成器函数返回一个生成器,被for循环时开始调用,每次得到yield的返回值,注意item只拿yield的值,原函数遇到return直接终止,因此可以以此作为终止条件

十四、类

1.基本格式

#类中的函数叫做方法,类名第一个字母大写
class Account:
    def func(self, name):  # 第一个形参必须加self(self是约定,也可其他)
        print(name)
        return 0


x = Account()
x.func("name")

2.初始化,封装

class Person:
    def __init__(self, n='yjj', a=1, g='男'):
        # 初始化方法(构造方法),给对象内部做初始化
        self.name = n
        self.age = a
        self.gender = g

    def show(self):
        temp = '我是%s,年龄:%s,性别:%s' % (self.name, self.age, self.gender)
        print(temp)
        return 0


# 类()实例化对象,自动执行一次类中__init__方法。

p1 = Person()
p2 = Person("铸币", 18, "女")
p1.show()
p2.show()

3.继承

# 父类(基类)
class Base:
    def f1(self):
        pass


# 子类(派生类)
class Foo(Base):
    def f2(self):
        pass


obj = Foo()
# 执行对象.方法时,优先在子类找,找不到再去父类,父类不能去子类找
obj.f2()
obj.f1()


#python3中默认继承的都是object类,开辟内存空间

class Foo:
    pass

class Foo(object):
    pass
#两者等价
#节省代码.可以把两个类公共的功能放入一个base中,然后各自派生

#python支持多继承,Foo(Base1,Base2),调用方法先从左边的找,支持多继承的有C++,JAVA和C#均不支持

注意事项:

  • 时刻清醒self是谁?

  • 初始化创建哪一类,就从哪一类优先去找。

class Base:
    def f1(self):
        self.f2()
        print('base.f1')
    def f2(self):
        print('base.f2')
class Foo(Base):
    def f2(self):
        print('foo.f2')
obj=Foo()
obj.f1()
#输出为foo.f2 base.f1

4.多态(多种形态、多种类型)鸭子模型

#python对于函数方法传参没有限制,可以是各种类型,但类中有使用某些方法例如arg.send,那么就对于传入类型有一个限制(必须要有send方法)

#我们认为只要嘎嘎叫的就是鸭子(只要有send方法的就是我们要的合法类型),JAVA则不行

三大特性总结

  • 封装:将相近的方法聚在一起

  • 继承:从左边起寻找,可以多继承

  • 多态:鸭子模型

    def func(arg):#多种类型,很多事物
        arg.send()#必须要有send方法
    

5.绑定方法和静态方法

#在类下面的一般方法称为绑定方法
class Foo:
    def __init__(self):
        self.name = 123

    def func(self, a, b):#由于没有用到self,pycharm会提示你创建为函数或者加上静态修饰器
        print(a, b)

    @staticmethod
    #Python内置的修饰器,可以不创建对象直接调用类里面的方法,相当于函数
    def f1():
        print(23)


obj = Foo()
obj.func(1, 2)

Foo.f1()
#绑定方法@staticmethod,参数无限制
#调用 类.方法名()
#或者 对象.方法名() 不推荐

6.类方法(静态方法的衍生)

# 加修饰器@classmethod
class Foo:
    def __init__(self):
        self.name = 123

    @classmethod
    def f2(cls, a, b): 
        # cls表示当前类,必须要有,其余参数无所谓
        print('cls是当前类', cls)


Foo.f2(1, 2)#输出:cls是当前类 <class '__main__.Foo'>

7.属性

对象.方法 不用加括号

# 加修饰器@classmethod
class Foo:
    def __init__(self):
        self.name = 123

    @property
    def f2(self):
        print('属性')


obj = Foo()
obj.f2

8.成员修饰符

变量前加’__'会使得其变成私有,只有类内部方法可以访问,外部不行,同时方法前面也可以加,同时甚至子类都不能访问

class Foo:
    def __init__(self, name='yjj'):
        self.__name = name

    def func(self):
        print(self.__name)


obj = Foo()
obj.func()#输出yjj
obj.__name#找不到__name       

9.强制访问私有

class Foo:
    def __init__(self, name='yjj'):
        self.__name = name

    def func(self):
        print(self.__name)


obj = Foo()
print(obj._Foo__name)#_类名__

10.类中的特殊方法(typora中想要打出双下划线需要前后加``)

__new__ __init__ __call__

class Foo(object):
    def __new__(cls, *args, **kwargs):
        print("已创建空对象")
        return object.__new__(cls)

    '''
    用于创建空对象,构造方法,默认继承的object开辟内存,然后默认调用new,因此可以不用写此类方法
    '''

    def __init__(self):
        print("已初始化")

    '''
    初始化对象
    '''

    def __call__(self):
        print("执行call方法")


obj = Foo()
obj()  # 对象加括号执行call方法


class Foo:
    def __new__(cls, *args, **kwargs):
        print("已创建空对象")
        return object.__new__(cls)

    '''
    用于创建空对象,构造方法,默认继承的object开辟内存,然后默认调用new,因此可以不用写此类方法
    '''

    def __init__(self):
        print("已初始化")

    '''
    初始化对象
    '''

    def __call__(self):
        print("执行call方法")


obj = Foo()
obj()  # 对象加括号执行call方法

__getitem__ __setitem__ __delitem__ 类似于字典用法

class Foo(object):
    def __setitem__(self, key, value):
        pass

    def __getitem__(self, item):
        pass

    def __delitem__(self, key):
        pass


obj1 = Foo()
obj1['k1'] = 123  # 内部调用setiterm,并且传参key为k1,value为123
obj1['xxx']  # 内部调用getitem
del obj1['ttt']  # 内部调用delitem

__str__

class Foo(object):
    def __str__(self):
        return "yjj"

    """
    只有在打印时才会自动调用此方法,且打印一个返回值
    """


obj = Foo()
print(obj)

__dict__

将对象里的属性转换成字典

__iter__

转换成可迭代对象

11.约束

拾遗

1.is判定内存地址是否一致

v1=[]
v2=[]
print(v1 is v2)#不在一个内存

v1=None
v2=None
print(v1 is v2)#True,同一内存,可以节省一点内存

2.位运算

#&与运算
#|或运算
#^异或
#~取反
#<<左移1位等价于乘2
#>>右移1位等价于除以2

3.pass,什么都不干,保持语法完整性

4.文件路径相关

import os
#获取当前py脚本所在路径
abs=os.path.abspath(__file__)#—__file__前后两个下划线
#找上一级目录
path=os.path.dirname(abs)

#集成
base_dir=os.path.dirname(os.path.abspath(__file__))
print(base_dir)
#这种函数拼接可以自适应,根绝不同系统判断加\还是/,可以无限拼接,逗号隔开
file_path=os.path.join(base_dir,'files.txt')
print(file_path)

#判断路径是否存在
if os.path.exists(file_path):
    print("YES")
else:
    print("NO")
 
#

5.内存相关(施工中P60)

b站视频

6.time.sleep()

import time
time.sleep(1)#线程挂起1秒,https://www.runoob.com/python/att-time-sleep.html

7.推导式

1.列表推导式

v1 = [i for i in 'alex']

v2 = [i + 100 for i in range(10)]

v3 = [lambda: i for i in range(10)]
print(v3[4]())  # 循环完后i=9,所以v3[any]()=9

v4 = [lambda x: x * i for i in range(10)]
print(v4[0](2))  # 18

2.集合推导式

v1 = {i for i in "alex"}
print(v1)

3.字典推导式

v1 = {'k' + str(i): i for i in range(10)}
print(v1)

4.字典去重实例(copy某大佬)

from functools import reduce

ll = [
        {
            "name":"1",
            "no":"2"
        },
        {
            "name": "1",
            "no": "2"
        },
        {
            "name": "2",
            "no": "3"
        }
    ]

func = lambda x, y: x if y in x else x + [y]
ll = reduce(func, [[], ] + ll)
print(ll)  # [{'name': '1', 'no': '2'}, {'name': '2', 'no': '3'}]

8.默认参数可变时产生的陷阱

def func(a, b=[]):
    b.append(a)
    return b


l1 = func(1)
l2 = func(2, [11, 22])
l3 = func(2)
print(l1, l2, l3)

#空列表在没有传入参数时默认开辟一块内存,但每个不传参的调用都指向同一块内存

9.sys解释器系统模块(施工中)

import sys
sys.stdout.write('123')#print()

10.print(xxx,end=‘’)以什么结尾,以\r回到当前行的起始位置

import time
for i in range(1,101):
    msg="%s%%\r"%i
    print(msg,end='')
    time.sleep(0.5)
#类似于进度条    
    

11.异常处理

#在任意地方填下如下代码,可以不报错终止程序
try:
    pass
except Exception as e:
    pass
#实例
def func(a):
    try:
        return a.strip()
    except Exception as e:
        return False


v = func('     alex     ')
if not v:
    print("执行失败")
else:
    print("结果是:", v)
    
    
    #捕获多种异常
    def test(a,b):
        try:
            return int(a,b)
        except(ValueError,TypeError):
            return 'error'
    #分情况 
    def test(a,b):
        try:
            return int(a,b)
        except ValueError:
            return 'value error'
        except TypeError:
        	return 'type error'
        	
   #捕获所有
	def test(a,b):
        try:
            return int(a,b)
        except:
            return 'error'
        
        
	def test(a,b):
        try:
            return int(a,b)
        except:
            return 'error'
        finally:
            print('a')
            #不管try还是except执行,finally语句都会在最后执行。可用于关闭文件等操作

12.//表示整除,返回值是精准值的整数部分(非四舍五入)

13.round()四舍五入

'''
python将.5如8.5,9.5这类取整到最接近的偶数上,前者为8,后者为10,而不是统一向上取整
'''
print(round(8.5))
print(round(9.5))

14、正则表达式可以通过查询re库解决,CSDN收藏

import re
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值