文章目录
前言
提示:这里可以添加本文要记录的大概内容:
本文继续继Python小白基础(3)的后续章节部分,介绍了python后面的一些相关基础的知识,还是相对基本的内容,文章可能会有些不严谨存在错误的地方望读者们谅解。
提示:以下是本篇文章正文内容,下面案例可供参考
一、yield传入参数和推导式
1.yield传入参数
yield是可以用来对其中断,然后reuturn出来做处理,最后想把它塞进去继续去执行,这个过程就叫做yield传入参数,属于生成器的内容。关键要会用__next__()
实例👇
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import time
def gen():
print(123)
content = yield 1#中断,return1,外面送内容给content
print("========",content)
print(456)
yield 2
pass
def main():
g = gen()
ret1 = g.__next__()#ret1 = 1
print("第一个yield返回",ret1)
ret2 = g.send("i am coming")#给第一个yield发东西,发完自动next
print("第二个yield返回",ret2)
pass
if __name__ == '__main__':
main()
实例结果为:
123
第一个yield返回 1
======== i am coming
456
第二个yield返回 2
有yield的函数已经成为一个生成器了,并且,直接调用函数是不会执行生成器里面的代码,只有使用next()或者send(),才会被执行生成器里面的函数。
第一次使用next()的时候,代码会执行到第一个yield(并且获取了yield 返回值 2),也就是本文中的 content = yield 2 ,后面的print 没有被执行,send()也是这样。
send()可以看来,是用来传递第一个参数,也就是将send()里面的内容传递给conetnt ,也就是content = 参数值,所以print 最后输出的是send(),括号里面的值。以此类推。
总结,可以理解为,next()和send()其实原理都差不多,都是从当前执行到下一个yield(不包含下一个yield,就算下一个前面有print,但是print 后面没有yield,也不会去执行。)
在Python中,使用yield的函数被称为生成器函数(generator function)。
针对生成器对象,python提供了两个主要方法,一个是next()
一个是send()
。
2.各种推导式
列表推导式
用一句话把列表表现出来,说白了就是用一句话生成一个列表
实例↓:
#! /usr/bin/python
# -*- coding: UTF-8 -*-
def main():
#列表推导式
mul = [i for i in range(30) if i%3 is 0]
print(mul)
pass
if __name__ == '__main__':
main()
结果:
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
函数列表推导式
#! /usr/bin/python
# -*- coding: UTF-8 -*-
#函数列表推导式
def squerd(x):
return x*x
def main():
mul = [squerd(i) for i in range(30) if i%3 is 0]
print(mul)
if __name__ == '__main__':
main()
结果为:
[0, 9, 36, 81, 144, 225, 324, 441, 576, 729]
嵌套列表推导式实例
#! /usr/bin/python
# -*- coding: UTF-8 -*-
def main():
#嵌套函数列表推导式
fruits =[['apple','banana','orange'],['fig','grape','mimikaz']]
#找到嵌套列表中包含两个a字母的水果的名字
print([name for lst in fruits for name in lst if name.count('a')>=2])
pass
if __name__ == '__main__':
main()
输出:
['banana']
字典推导式(用于键值调换)
字典是按键进行遍历的在本案例中
注:本案例中最后输出的时候字典的键和值进行了调换👇
#! /usr/bin/python
# -*- coding: UTF-8 -*-
def main():
dic1 = {'a':1,'b':2}
dic2 = {dic1[k]:k for k in dic1}
print(dic2)
if __name__ == '__main__':
main()
输出为:
{1: 'a', 2: 'b'}
集合推导式
#! /usr/bin/python
# -*- coding: UTF-8 -*-
def main():
li = [1,2,3,-1,-2,-3]
s = {x**2 for x in li}
print(s)
if __name__ == '__main__':
main()
运行结果如下:
{1, 4, 9}
二、执行函数
把字符串当作python的代码来执行
当作!!
eval
#! /usr/bin/python
# -*- coding: UTF-8 -*-
def main():
s = 'print("haha")'
#简单的作为字符串输出
print(s)
#把s里面的字符串当作python代码来执行,这时候s会被其解析
eval(s)
if __name__ == '__main__':
main()
以上实例↑就是执行字符串所代表的代码,并且返回结果
exec
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import os
def main():
s = 'os.system("ipconfig")'
exec(s)
if __name__ == '__main__':
main()
运行成功执行了exec危险函数并返回结果
三、模块
每一个python文件都是一个模块
对于py起的文件名,要避免关键词
引入外部文件
test123的内容如下
#! /usr/bin/python
# -*- coding: UTF-8 -*-
def fun1():
print("i am test123——fun1")
pass
def fun2():
print("i am test123——fun2")
pass
def main():
pass
if __name__ == '__main__':
main()
test1主文件内容如下:
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import test123#引入外部模块
def main():
test123.fun1()#直接调用
test123.fun2()#直接调用
if __name__ == '__main__':
main()
运行test1
输出:
i am test123——fun1
i am test123——fun2
如果只需要引入某个函数也可以使用from 【模块名】import 【函数】
#! /usr/bin/python
# -*- coding: UTF-8 -*-
from test123 import fun1#如果只需要引入某个函数
def main():
fun1()
if __name__ == '__main__':
main()
i am test123——fun1
修改别名
import test123 as nn
——给test123引入之后取别名为nn
取其别名为nn
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import test123 as nn#取别名为nn
def main():
nn.fun1()
nn.fun2()
if __name__ == '__main__':
main()
运行效果也一样:
i am test123——fun1
i am test123——fun2
引入所有函数
from test123 import *
#! /usr/bin/python
# -*- coding: UTF-8 -*-
from test123 import *
def main():
fun1()
fun2()
if __name__ == '__main__':
main()
在引用的时候限制引用的函数
头部加上这个就行了
__all__=['fun1']#人家引用你的时候,最多只能引用fun1
四、包
#引入包
import pa.test123
def main():
pa.test123.fun1()
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import pa.test123#引入包
def main():
pa.test123.fun1()
pa.test123.fun2()
if __name__ == '__main__':
main()
一个包有很多个功能模块
新建文件夹,文件夹里必须包含文件名为_init_.py的文件!!
五、python自带模块
1.json模块
import json
补:转化为json字符串——可以到互联网上传输
反序列化为原来的type类型(这里是字典)
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import json
dic = {'name':'tom',"age":19,'job':'hacker'}
str = json.dumps(dic) #将一个字典转换为jsosn字符串
print(type(str))
print(str)
print("=================")
str2 = json.loads(str)#反序列化为原始的
print(type(str2))
print(str2)
运行结果如下👇:
<class 'str'>
{"name": "tom", "age": 19, "job": "hacker"}
=================
<class 'dict'>
{'name': 'tom', 'age': 19, 'job': 'hacker'}
2.md5加密模块
md5不仅可以用来加密,也可以用来提取hash值
import hashlib
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import hashlib
def main():
md5 = hashlib.md5()#使用md5对以后的数据进行摘要加密
md5.update(('hello world').encode('utf-8'))#对目标进行操作(对字符串加密之前要转为utf-8)
print(md5.hexdigest())#输出结果就是字符串md5加密后的密文
if __name__ == '__main__':
main()
结果为:
5eb63bbbe01eeed093cb22bb8f5acdc3
3.配置文件模块
配置文件初始化
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import configparser
def main():
#初始化
conf = configparser.ConfigParser()
conf['default'] = {'money':100,'go':'yes','weapon':'no'}
conf['home'] = {'island':'xiaodao1'}
with open('./config','w') as f:
#配置文件写入
conf.write(f)
pass
if __name__ == '__main__':
main()
运行后创建了一个config文件如下👇
读取配置文件并判断
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import configparser
def main():
#初始化
conf = configparser.ConfigParser()
#读取配置文件
conf.read('config')
#判断是否存在
print('home' in conf)
pass
if __name__ == '__main__':
main()
True
遍历key
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import configparser
def main():
#初始化
conf = configparser.ConfigParser()
#读取配置文件
conf.read('config')
#遍历key
for key in conf['default']:
print(key)
pass
if __name__ == '__main__':
main()
输出
:
money
go
weapon
或者也可以:
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import configparser
def main():
#初始化
conf = configparser.ConfigParser()
#读取配置文件
conf.read('config')
#获取所有的键
print(conf.options('default'))
if __name__ == '__main__':
main()
获取对应的值
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import configparser
def main():
#初始化
conf = configparser.ConfigParser()
#读取配置文件
conf.read('config')
#获取对应的值
print(conf.get('default','money'))
if __name__ == '__main__':
main()
输出
:
100
获取所有的键值对
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import configparser
def main():
#初始化
conf = configparser.ConfigParser()
#读取配置文件
conf.read('config')
#获取所有的键值对
print(conf.items('default'))
if __name__ == '__main__':
main()
输出
:
[('money', '100'), ('go', 'yes'), ('weapon', 'no')]
4.坐标系模块
定义设置坐标系
#! /usr/bin/python
# -*- coding: UTF-8 -*-
from collections import namedtuple
#定义坐标系
#定义一个名为point的坐标,坐标两个参数分别为x y
def main():
point = namedtuple('point',['x','y','z'])
p = point(10,20,30)
print(p.x)
pass
if __name__ == '__main__':
main()
10
5.时间和日期模块
时间模块
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import time
def main():
print("start")
time.sleep(3)
print("end")
pass
if __name__ == '__main__':
main()
start
end
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import time
def main():
#输出当前时间戳(从1970-1-1 0:0:0一直到现在的秒数)
print(time.time())
#输出当前的24小时时间
print(time.strftime('%Y-%m-%d %x'))
#输出当前的24小时时间
print(time.strftime('%Y/%m/%d %H:%M'))
pass
if __name__ == '__main__':
main()
运行结果为:
1677036198.9363484
2023-02-22 02/22/23
2023/02/22 11:23
日期模块
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import time
import datetime
def main():
#显示当前的精准日期
now = datetime.datetime.now()
print(now)
#三周后的
print(datetime.datetime.now()+datetime.timedelta(weeks=3))
pass
if __name__ == '__main__':
main()
2023-02-22 11:29:39.198268
2023-03-15 11:29:39.198268
若要调整时间或者时间戳转换为当前日期↓
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import time
import datetime
def main():
#显示当前的精准日期
now = datetime.datetime.now()
print(now)
#三周后的
print(datetime.datetime.now()+datetime.timedelta(weeks=3))
#调整时间
print(now.replace(year=2000,month=1,day=1))
#时间戳转换为当前时间
sjc = time.time()
print(datetime.date.fromtimestamp(sjc))
pass
if __name__ == '__main__':
main()
2023-02-22 11:34:17.449878
2023-03-15 11:34:17.449878
2000-01-01 11:34:17.449878
2023-02-22