Python学习-遇到的方法

1)get(key ,default)

 

或者一个字典中对应key的数据,如果有对应key,则返回key的值,如果没有则返回default默认值,如果没有设置默认值,则按None处理 

 2)dict()函数

生成字典

b = ((1, "张三"), (2, "李四"), (3, "王五"))
b = [(1, "张三"), (2, "李四"), (3, "王五")]
b = ([1, "张三"], [2, "李四"], [3, "王五"])
b = [[1, "张三"], [2, "李四"], [3, "王五"]]
#   四种方式均可以
print(dict(b))
输出:
    {1:"张三",2:"李四",3:"王五"}

当有两个列表或元祖符合键值对时,可以使用zip()函数现将键值对组合.

x = (1, 2, 3)
y = ("红", "黄", "蓝")
print(dict(zip(x, y)))

 3)zip()函数

把可迭代对象按索引进行组合成元祖,按对象中最小索引返回,返回的是zip对象可迭代对象),可以以列表list()这个函数(对象迭代器)的形式将其以列表形式读取出来

aList = [1, 2, 3, 4]
print(list(zip(aList)))
# 结果为:[(1,), (2,), (3,), (4,)]
aList = [1, 2, 3, 4]
bList = ["a", "b", "c", "d"]
print(list(zip(aList, bList)))
# 结果:[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
aList = [1, 2, 3, 4]
bList = ["a", "b", "c", "d"]
for i, j in zip(aList,bList):
    print(i, j)
# 结果: 
        1 a
        2 b
        3 c
        4 d

 4)range(起始值,结束值,步进值)函数

生成一个左开右闭数列,同时返回的是一个range对象(可迭代对象),需要用list()函数进行读取

print(list(range(1, 10, 1)))
# 结果:[1, 2, 3, 4, 5, 6, 7, 8, 9]

其中起始值默认为0,步进值默认为1,要省略同时省略

print(list(range(10)))
# 结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

5)pprint()模块

使长字段文本更容易阅读

import pprint

d = {
    "apple": {"juice":4, "pie":5},
    "orange": {"juice":6, "cake":7},
    "pear": {"cake":8, "pie":9}
}
pprint.print(d)
# 结果:
{'apple': {'juice': 4, 'pie': 5},
 'orange': {'cake': 7, 'juice': 6},
 'pear': {'cake': 8, 'pie': 9}}

参考链接:

一文弄懂Python中的pprint模块 - 知乎

 6)Threading多线程模块

threading.Thread(target=函数)

        进行多线程创建

import threading
import time


def demo_1():
    while True:
        print("111111")
        time.sleep(1)


t1 = threading.Thread(target=demo_1)
t1.start()
while True:
    print("333333")
    time.sleep(1)

threading.Thread(targrt=函数,args(x, y,...))

        当多线程的函数需要传递参数时,需要用args进行传递,注意这里必须是元组形式,不管参数有几个

import threading
import time


def demo_1(num1, num2):
    print(num1+num2)
    time.sleep(1)


t1 = threading.Thread(target=demo_1, args=(1, 2))
t1.start()

threading.Thread(targrt=函数,args(x, y,...), kwargs={})

        当需要指定传递的参数时,可以使用kwargs,进行指定参数的传递,这里的key就是对应要传递的参数名,对应key值就是要传递的值

import threading
import time


def demo_1(num1, num2, n):
    print(num1+num2+n)
    time.sleep(1)


t1 = threading.Thread(target=demo_1, args=(1, 2), kwargs={"n": 1})
t1.start()

threading.enumerate()

        生成一个当前进程数的列表

import threading
import time

print(threading.enumerate())
def demo_1():
    for a in range(5):
        print("111111")
        time.sleep(1)


t1 = threading.Thread(target=demo_1)
t1.start()
print(threading.enumerate())
time.sleep(6)
print(threading.enumerate())

通过创建类来继承threading父类

        用此方法时,必须创建run方法,通过创建的类方法调用start(),程序会自动寻找run

方法进行多线程操作,run方法的结束意味着多线程结束

import threading


class MyThread(threading.Thread):
    def run(self):
        print("hahahah")


t_1 = MyThread()
t_1.start()

threading.Thread.join()

        用来阻塞主线程,作用是,等副线程结束后,才会继续操作主线程

import threading
from time import sleep, ctime

def world():

    for i in range(2):
        print "Hello World! " + ctime()
        sleep(2)

def ivanli():

    for i in range(2):
        print "Hello Ivanli! " + ctime()
        sleep(5)


def getThreads():

    threads = []
    t1 = threading.Thread(target=world)
    t2 = threading.Thread(target=ivanli)
    threads.append(t1)
    threads.append(t2)

    return threads

if __name__ == "__main__":

    threads = getThreads()
    
    for t in threads:
        t.start()
        
    for t in threads:
        t.join()

    print "main process .. "


main process最后才会输出

        如果在每个线程后跟上join()那么每个线程都会被保护,即执行完第一个线程后,才会执行接下来的线程

import threading
from time import sleep, ctime

def world():

    for i in range(2):
        print "Hello World! " + ctime()
        sleep(2)

def ivanli():

    for i in range(2):
        print "Hello Ivanli! " + ctime()
        sleep(5)


def getThreads():

    threads = []
    t1 = threading.Thread(target=world)
    t2 = threading.Thread(target=ivanli)
    threads.append(t1)
    threads.append(t2)

    return threads

if __name__ == "__main__":

    threads = getThreads()

    for t in threads:
        t.start()
        t.join()

    print "main process .. "

threading.Event()

        1)threading.Event().set():主动设置为True

        2)threading.Event().clear():主动设置为False

        3)threading.Event().wait(Timeout=None):等待None s设置为True,若未设置,则

                                                                                   永远等待

        在副进程的过程中,如果事件被置为False,则会一直等待事件被置为True后,才会继续副进程中接下来的代码

import threading
import time,random

def say(e):
    time.sleep(random.random())
    print '准备说话中。。。。'
    e.wait()
    time.sleep(random.random())
    print('%s->可以开始说话了' % (threading.currentThread().name))

e = threading.Event()
t1 = threading.Thread(target=say, args=(e,), name='线程1')
t2 = threading.Thread(target=say, args=(e,), name='线程2')
t1.start()
t2.start()

time.sleep(10)
e.set()


两个副进程到“准备说话中。。。”时就在等待事件被置为True,直到主进程运行到了set()才会继续进程

参考链接:GitHub - cantools/cantools: CAN bus tools.

                  CAN BUS tools — cantools 34.3.0 documentation

7)格式化操作符 

print("{0}:{1}".format(10, 1))           # 类似传参,012.。代表参数的位置
print("{0}{name}".format(10, name=1))    # 传参,但是可以指定参数名称
print("{0:.3f}".format(3.14159))         # 传参,通过:指定对参数的操作。3f就保留小数点后三位
print("{0:10}={1:10d}".format(10, 20))   # 传参,通过:指定对参数的操作10即参数右侧空10位,10d就是左侧空十位
print("{0:*>10}".format(1))              # 传参,通过>指定符号的复用,左侧为符号,右侧为复用次数
print("{0:*>10,.2f}".format(100))        # 传参,通过,可以指定多种操作
print("二进制输出{0:b}".format(15))         # 传参,通过d可以进行二进制转换
print("十六进制输出{0:x}".format(15))       # 传参,通过x可以进行十六进制转换
print("千分位输出{0:,}".format(100000000))  # 传参,通过,进行千分位识别
print("{0:+f}".format(11))                # 传参,通过+f可进行带符号输出
print("{0:.2%}".format(0.1234))           # 传参,通过.2%进行百分数操作

8)os模块

os.rename("目标文件/目录名","需要更改的文件/目录名")

        当需要对其他路径文件进行操作时,需要将加上路径,注意:操作文件名时,只能在相同目录下进行改名,即需要更改的文件名路劲必须加上,且与原始路径一致

os.renames("1111", "2222")
os.rename('C:\\Users\\Xianlinnvwu\\Desktop\\新建 文本文档.txt', "C:\\Users\\Xianlinnvwu\\Desktop\\新建个屁.txt")

 os.renames("目标文件/目录名", "需要更改的文件/目录名")

        区别与rename的地方是,此方法可以进行目录树状结构的创建,及可以使用不同目录进行修改,既能修改文件,也能修改目录

os.renames('2222', "b/333")

os.remove("文件名")

        该方法只能删除文件,不能删除目录

os.remove("b\\333")

os.rmdir("目录名")

        注意,该目录必须是空目录,否则不能删除,但可以是多层级目录,最终能够删除的是最后那个目录

os.rmdir("a\\b\\c")

os.removedirs("目录名")

        注意,该目录必须是空目录,否则不能删除,而且对多层级目录进行删除时,会直接删除多层级目录

os.removedirs("a\\b\\c")

os.mkdir("需要创建的目录名")

        注意,只能在已有的目录下创建新的目录,不能创建目录树

os.mkdir("a")

os.makedirs("需要创建的目录名")

        注意,可以创建目录树

os.makedirs("a\\b\\c\\d\\f")

os.getcwd()

        获取当前目录

os.getcwd()

os.listdir("目标目录")

        将目标目录的内容以列表形式展现

print(os.listdir("a啊"))

对文件的高级操作:

a_file = open("a啊\\b啊\\1.txt", "r", encoding="utf-8")
b_file = open("a啊\\2.txt", "w", encoding="utf-8")
a = a_file.read(1024)
b = b_file.write(a)

        w、r用来指定文件的读写操作类型

        调用file.read(数据大小),可以指定一次性读取内容的大小,以kb为单位

os.path.abspath()

        获取当前的绝对路径

print(os.path.abspath(__file__)) # 会输出当前文件
print(os.path.abspath(""))       # 只有当前目录
print(os.getcwd())               # 与上面一样

os.path.join(路径1, 路径2...)

        将路径进行合并

a = "1"
b = "2"
print(os.path.join(a, b))

os.path.split(路径)

        将路径进行拆分,分为目录+文件的元组形式

a = "D:\Pycharm\mygame\venv\Scripts\python.exe"
print(os.path.split(a))



#  输出为('D:\\Pycharm\\mygame\x0benv\\Scripts', 'python.exe')

os.path.splitext(路径)

        获取当前文件名类型,分为目录+文件类型的元组形式

a = "D:\Pycharm\mygame\venv\Scripts\python.exe"
print(os.path.splitext(a))


#   输出为('D:\\Pycharm\\mygame\x0benv\\Scripts\\python', '.exe')

os.path.isdir(路径)判断是不是目录

os.path.exist(路径)判断路径是否真实存在

os.path.isfile(路径)判断是不是文件

os.path.getsize(文件路径)获取文件大小

os.path.dirname(文件)获取目标文件的目录

os.path.basename(文件)获取当前文件名和类型

os.path.getatime(路径)获取最后访问时间

os.pathctime(路径)获取最近创建时间

os.pathmtime(路径)获取文件的修改时间

8)hashlib加密模块

hashlib.md5(str(列表名)).encode("UTF-8"))

        进行md5加密指定字符串

import hashlib
password = "daohaozhe"
h1 = hashlib.md5(str(password).encode("utf8"))

hashlib.md5(str(列表名)).encode("UTF-8")).hexdigest()

        获取加密后的数据

import hashlib
password = "daohaozhe"
h1 = hashlib.md5(str(password).encode("utf8"))
print(h1.hexdigest())

9) Python数据类型:bytes和bytearray

都是二进制数据类型,将数据通过二进制进行编码

bytes

        类似于字符串,字符串是由一个个字符顺序存储组成的序列,其中每个元素为一个字符。bytes是由一个个bute组成的序列,每一个元素是一个byte

bytearray

        是由一个个byte组成的array,其中每一元素为一个byte。

总结:

        bytes:可以看做是一组二进制数值(0-255)的str序列

        bytearray:可以看做是一组二进制数值(0-255)的list序列

参考文档:python数据类型 ——bytes 和 bytearray - 走看看

10)字典多值遍历

dict_a = {"a": 1, "b": 2, "c": 3}
for a, b in dict_a.items():
    print(a)
    print(b)

 dict.items()会返回key和key值,所以遍历时,需要用两个参数来接收

11)json模块

可以识别json内容

import json
from pprint import pprint
with open("can_commands.json","r") as file:
    dict_read = json.load(file)

pprint(dict_read)
print(type(dict_read))

 通过json.load()将内容里的数据以python能识别的对象方式返回,

12)configparser()模块

配置文件ini进行读写操作

configparser.ConfigParser()

        创建一个配置类,通过类可以完成读写操作

import configparser
config = configparser.ConfigParser

 config.read("ini文件路径",encode=utf-8"")

        读取ini文件的内容

config.read('pcan_config.ini', encoding="utf-8")

config.sections()

        读取ini文件内的节点名,并返回一个列表

import configparser
config = configparser.ConfigParser()
config.read('pcan_config.ini', encoding="utf-8")
print(config.sections())  # ['can', 'canfd']

config.items("节点")

        读取对应节点中的内容,并返回一个列表,每个元素都是一对元祖

import configparser
config = configparser.ConfigParser()
config.read('pcan_config.ini', encoding="utf-8")
print(config.sections())  # ['can', 'canfd']
print(config.items("can")) # [('dbc', '20220318-jh1-ES33_ICM_V4.6_INFOCAN_Cluster.dbc'), ('channel', 'PCAN_USBBUS1'), ('bitrate', '500000')]
for key, value in config.items("can"):
    print(key, value)       # dbc 20220318-jh1-ES33_ICM_V4.6_INFOCAN_Cluster.dbc
                            # channel PCAN_USBBUS1
                            # bitrate 500000

config.get("节点名","节点下的kye")

        返回ini文件中对应节点名下的kye的值

import configparser
config = configparser.ConfigParser()
config.read('pcan_config.ini', encoding="utf-8")
print(config.sections())  # ['can', 'canfd']
print(config.items("can")) # [('dbc', '20220318-jh1-ES33_ICM_V4.6_INFOCAN_Cluster.dbc'), ('channel', 'PCAN_USBBUS1'), ('bitrate', '500000')]
for key, value in config.items("can"):
    print(key, value)       # dbc 20220318-jh1-ES33_ICM_V4.6_INFOCAN_Cluster.dbc
                            # channel PCAN_USBBUS1
                            # bitrate 500000
print(config.get("can", "dbc")) # 20220318-jh1-ES33_ICM_V4.6_INFOCAN_Cluster.dbc

config.has_section("需要搜索的节点名")

        查找对应ini文件中是否有搜索节点,返回布尔

print(config.has_section("can"))  # True

config.add_section("需要增加的节点名")

        在当前读取的ini内存中,增加一个节点名,注意:当前只存在于内存

config.write(一个文件对象)

        将当前读取的ini内存,写入ini文件中

        文件对象:open("路径","w", encoding="utf-8")

        改文件若不存在,则会自动生成

config.write(open("pcan_config.ini", "w", encoding="utf-8"))

config.set("节点名","需要指定的key", "需要指定的key值")

        在对应节点增加需要的键值对

        注意:当前只存在内存中,要写入,需要write

config.set("can", "num", "3")

config.remove_section("需要删除的节点名")

        删除指定节点,

        注意,当前只在内存删除,要写入,需要write

config.remove_section("lin")

config.remove_option("需要key所在的节点","需要删除的key")

        删除指定节点下的键值对

        注意,当前只在内存中删除,要写入,需要write

config.remove_option("can", "num")

13f-string格式化字符串常量

使字符串的拼接更加方便

age = 18
age_diff = 5
print("我今年"+str(age)+"岁,他比我大"+str(age——diff)+"岁")
print(f"我今年{age}岁,他比我大{age_diff}岁")

14pysimpelgui-exemaker

 1)将PySimpleGUI生成的应用程序打包成exe应用程序

pip install pysimplegui-exemaker

2) 使用方式

        在cmd中输入:

        python -m pysimplegui-exemaker.pysimplegui-exemaker

 15queue

queue的类有四种

        1) queue.Queue(maxsize=0)

                先进先出队列

                maxsize整数,设置队列的最大程度

        2) queue.LifoQueue(maxsize=0)

                后进先出队列

        3) queue.PriorityQueue(maxsize=0)

                优先级队列,比较队列每个数据大小,值最小的最先出队(只能比较数字),一般以

                (1,data),(2,data)..这种方式进行数据插入

        4) queue.SimpleQueue

                先进先出队列的简单类型,没有大小限制,缺少task_done,join这些高级功能

queue的异常种类

        1) queue.Empty

                主要用于队列没有数据仍取数据时抛出的异常

        2) queue.Full

                主要用于队列元素容量上限后,继续放入队列时抛出的异常

queue具体类的方法(以下以q代替)

        1) q.qsize()

                返回队列中元素的个数

        2) q.empty()

                如果队列为空,返回True,否则返回False

        3) q.full()

                如果队列元素上限,返回True,否则返回False

        4) q.put(item,block=True,timeout=None)

                item:放入队列的数据元素

                block:判断队列上限时是否可以继续等待放入数据,如果为False,则直接抛出

                            queue.full异常;如果为True,则可接受timeout时间内放入等待数据,如果

                            超时,抛出queue.full异常,如timeout未定义,则可以一直等待

        5) q.put_nowait(item)

                相当于q.put的block=False,即立即检测是否可以放入,否则抛出异常

        6) q.get(block=True,timeout=None)

                block:判断是否还有数据元素可以取出,如果为False,不会等待,直接抛出异常

                            queue.Empty;如果为True,则可接受timeout时间内取出数据元素,如果

                             超时,抛出queue.Empty,如timeout未定义,则可一直等待

        7)q.get_nowait()

                 相当于q.get的block=False,即立即检测是否可以取出,否则抛出异常

queue的高级方法:

        1)q.task_done()

                一个动作标志,每个get都必须获取一个数据元素,该标志的出现表示队列内的数

                据元素已被取出,后续告诉队列,该数据的处理已完成。如果被调用的次数杜宇放

                入队列中元素的个数,则抛出ValueError异常。

        2)q.join()

                与task_done组合使用,他的出现可以一直阻塞后续程序的运行,直到队列中所有

                数据元素都被取出和执行,当然只要有元素添加到queue中,task_done都得更

                新,直到最终计数等于0,join()作用消失,不会阻塞

                

16assert

assert judge,str(错误事件抛出文本)

    自定义一个条件judge,事件满足条件,程序继续运行,否则 抛出异常"错误事件抛出文本"

17多进程Process 

1)用法

        from multiprocessing import Process

与多线程的对比

18协程

 1)用法

        -依赖库

                import asyncio

        -获取事件循环

                loop = asyncio.get_event_loop()

        -定义协程

                async def myfunc(url):

                        await get_url(url)

        -创建task列表

                tasks = [loop.create_task(myfunc(url))for url in urls]

        -执行爬虫事件列表

                loop.run_until_complete(asyncio.wait(tasks))

19vars

 1)vars(object)说明

        返回object的属性和属性值的字典对象

class ni():
    def __init__(self, a, b, c, d):
        self.a = a
        self.b = b
        self.c = c
        self.d = d

nni = ni(2, 4, 5, 7)
print(vars(nni))     
for i, j in vars(nni).items():
    print(i, '=', j)

结果:

{'a': 2, 'b': 4, 'c': 5, 'd': 7}
a = 2
b = 4
c = 5
d = 7

20map()

 1)map(function,iterable,...)

第一个参数 function 以参数序列(iterable)中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

def plus(a):
    a += 1
    return a


a = [1,2]
res = map(plus,a)



结果:[2,3]
def add(a,b):
    return a+b


a= (1, 2)
b = (2,4)
res = map(add, a, b)

结果:[3,6]

21time&datetime

from datetime import *
import time #要写在from datetime import *的后面
print(time.strftime('%Y/%m/%d %H:%M', time.localtime()))
print(datetime.datetime(2022, 6, 29, 23, 59))
print(datetime.datetime.now().strftime('%Y/%m/%d %H:%M'))
print(datetime.datetime(2022, 6, 29, 23, 59).strftime('%Y/%m/%d %H:%M'))

​​​​​​​按自己的形式进行格式化输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值