这一节总结点demo和常用知识点
目录
有关字符串格式化打印的
lambda匿名函数,,将匿名函数作为参数传入
文件读写
生成器
python的装饰器
简单的网站代码:
有关三元运算
推导式:
新浪面试题:
有关面向对象里面三种方法
有关字符串格式化打印的
name="asas"
age=12
print(f"我是:{name},年龄:{age}") f-string
print("我是:",name,"年龄:",age)
print("我是:{},年龄:{}".format(name,age)) format
print("我是:%s,年龄:%d"%(name,int(age))) 格式化
print("网站名:{name}, 地址 {url}".format(name="菜鸟教程", url="www.runoob.com"))
# 通过字典设置参数
site = {"name": "菜鸟教程", "url": "www.runoob.com"}
print("网站名:{name}, 地址 {url}".format(**site))
# 通过列表索引设置参数
my_list = ['菜鸟教程', 'www.runoob.com']
print("网站名:{0[0]}, 地址 {0[1]}".format(my_list)) # "0" 是必须的
把函数当做参数传给函数,,直接形参就随便一个变量名就行,只要你想,他就可以代表一个函数,
记住对于python的函数参数名来说,他可以代表任何的数据类型,只是看你用啥往进传就可以,
def fun(a) -> 我这个a可以代表函数,字符串,列表 ,元组啥的 字典的话就得**a了,,不过写a的话字典就能传进去一组kv
def func(name,**age):
print(name,age)
def funs(grade,fx):
print(grade)
fx(12,李四='aa',sad=12)
print(type(fx))
funs(5,func)
lambda匿名函数,,将匿名函数作为参数传入
格式是: lambda 参数 : 函数体 (只能写一行)
def test_func(com):
print(f"结果是:{com(1,2)}")
#lambda匿名函数,,将匿名函数作为参数传入
test_func(lambda x,y:x+y)
文件读写
fd=open("D:/xxt.txt","r",encoding="UTF-8")
#read 里面可以指定具体读多少字节
#读方法每次读都是从上个位置后面开始,调用一次读完,再调用
#指针在最后面,读的话就没东西了
print(f"读取全部内容:{fd.read()}")
print(f"读取全部内容:{fd.read()}")
print(f"读取全部内容:{fd.readlines()}")
#readlines读取文件全部行,能读到换行符,并封装到列表中
#readline 一次读一行
for line in fd:
print(f"读取一行内容:{fd.readline()}")
fd.close()#关闭文件
with open("D:/xxt.txt","r",encoding="UTF-8") as f: #自带close
做一个小案例,。。要不说python方便 ,案例是打开文件统计一下里面Python3的个数
方法1:
with open("D:/xxt.txt","r",encoding="UTF-8") as f: #自带close
num=f.read()
print("Python3的数量是:",num.count("Python3"))
方法2:
strip()去除开头和结尾的空格和换行符
Python split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
ans=0
with open("D:/xxt.txt","r",encoding="UTF-8") as f: #自带close
for line in f:
ls=line.strip() #去除开头尾巴空格 换行符
print(ls)
words=ls.split(" ") #以空格分割
for word in words:
if word=="Python3":
ans+=1
print(ans)
写的操作的话就是write,w文件不存在就创建,存在清空重新写,a直接给内容追加
生成器
有yield的就是生成器,你去调用的话这个函数不会运行的,需要你next和for去用
用好yield可以很好的节省内存,做优化;用多少拿多少
生成器函数:yield 函数里的东西 一点点返还给你,碰到yield就暂停了
next(生成器对象)会从上次yield位置继续往下走
#生成器函数
def func():
print("进来了")
yield 11 #返回一个11 用next接受
#走到yield 冻结了,要往下执行,需要继续调next
print("又来了")
yield 22
print("最后一次")
yield 33
gen=func()
v1=next(gen)
print(v1)
v2=next(gen)
print(v2)
v3=next(gen)
print(v3)
#生成器函数
def func():
print("进来了")
yield 11
yield 22
print("最后一次")
yield 33
gen=func()
for it in gen:
print(it)
def create_big_num(maxnum):
start=0
while True:
yield start
start+=1
if start==maxnum:
return
obj=create_big_num(10)
for its in obj:
print(its)
python的装饰器
@...语法糖
装饰器就是拓展一个函数的功能,info就像一个参数被outer的func接收,进到outer里面,有个inner函数,开始执行inner,而res接收func,其实就是接收info的执行结果,所以里面info这个函数被调用,最后返回info结果,返回inner结果。一层套一层这样,outer就是这个装饰器,inner函数是具体内容实现,内部调用info函数
结果就是before,info,after
def outer(func):
def inner():
print("before")
res=func()
print("after")
return res
return inner
@outer
def info():
print("info")
info()
没有@这个语法糖,上面调用 的话就得这么写
ans=outer(info)
ans()
其实就等于 逻辑上的,ans=inner
换句话说,其实使用装饰器的是,默认传入的参数就是被装饰的函数
#语法糖
@xxx() #@函数名
def ss():
pass
调用ss()
python内部会自动执行 xxx(ss),执行完之后把结果赋值给ss
等于ss=xxx(ss)
xxx就充当了装饰器,形成了闭包
提一嘴有关py的作用域,全局变量在局部里面,只能去读,或者修改内部元素(也是能是可变的类型,,比如列表等等),,注意是不能赋值的,。如果要赋值,需要在局部里面给变量标识globol,标志他是全局的变量
局部和全局同名,局部内部操作,优先是局部,,如果找不到才会往上一级去找
lis=[1,2,3,4,"你好"]
print(lis)
def sis():
lis=[5,5,5,"sas"]
lis[0]="jk"
print(lis)
lis.append("再见")
print(lis)
sis()
print(lis)
只能修改,可变类型的
lis=[1,2,3,4,"你好"]
print(lis)
def sis():
lis[0]="jk"
print(lis)
lis.append("再见")
print(lis)
#下面两个报错
#lis=[5,5,5]
#print(lis)
sis()
print(lis)
lis={1,2}
print(lis)
def sis():
lis.add("sas")
print(lis)
#下面两个报错
#lis=[5,5,5]
#print(lis)
sis()
print(lis)
简单的网站代码:
from flask import Flask
app=Flask(__name__)
def index():
return "首页"
def info():
return "中心"
app.add_url_rule("/index/",view_func=index)
app.add_url_rule("/info/",view_func=info)
app.run()
运行:
有关三元运算
三元运算和lambda可以实现简单的函数
lambda只能写一行,三元运算可以进行简单的条件判断
三元运算 # true if 条件 else false
func=lambda x: "大了" if x>66 else "小了"
print(func(1))
print(func(99))
内置排序
推导式:
列表,字典,集合都可以,直接就生成了对应数据
而对于元组用推导式,生成的是生成器对象,,需要用next或者for去使用
num_list=[i for i in range(10) if i>6]
num_list=[(i,i) for i in range(10) if i>6]
print(num_list)
num_set={i if i%2 else -i for i in range(10)}
print(num_set)
exp:
dis={'opi':"光头强",
'is':"熊大",
'lp':"熊二",
'498':"美羊羊"}
res=sorted(dis.items(),key=lambda x:x[0])
print(res)
data="%".join(["{}={}".format(key,value) for key,value in res])
print(data)
新浪面试题:
dip=[lambda x:x+i for i in range(10)]
#i变成9最后
v1=dip[0](100) #执行到这 才去lambda x+i这块执行函数
v2=dip[3](100)
print(v1,v2) #都是109
包文件夹都会有个__init__.py这个主要就是说明这个包是干嘛的,,py2里面必须有,py3里面可以不需要,,建议弄包的时候都创建这么个文件
对于导入包来说,想要导入任意的包怎么办?
#添加到python的内置路径位置
import sys
sys.path.append("想要添加的路径")
注意:写模块名称的时候不能和内置模块重名
有关面向对象里面三种方法
类方法(传类),绑定/实例方法(传对象),静态方法(不用传类或者对象去调用)
其实对于三种方法来说,类和对象都是可以去调用的,只不过依情况而定
一般而言,用对象去调用绑定方法;类去调用类方法;类去调用静态方法