Python利用psutil實(shí)現(xiàn)獲取硬件,網(wǎng)絡(luò)和進(jìn)程信息
楔子
Python 有一個(gè)第三方模塊叫 psutil,專(zhuān)門(mén)用來(lái)獲取操作系統(tǒng)以及硬件相關(guān)的信息,比如:CPU、磁盤(pán)、網(wǎng)絡(luò)、內(nèi)存等等。下面來(lái)看一下它的用法,不過(guò)在使用之前需要先安裝,直接 pip install psutil 即可。
CPU 相關(guān)
獲取 CPU 的邏輯核心數(shù)量
import?psutil print(psutil.cpu_count())??#?12 #?或者使用?multiprocessing import?multiprocessing print(multiprocessing.cpu_count()) #?12
獲取 CPU 的物理核心數(shù)量
import?psutil print(psutil.cpu_count(logical=False))??#?6
結(jié)果為 6,說(shuō)明是 6 核超線程;如果 CPU 的物理核心數(shù)和邏輯核心數(shù)相等,也為 12,則說(shuō)明是 12 核非超線程。
統(tǒng)計(jì) CPU 的用戶/系統(tǒng)/空閑時(shí)間
import?psutil print(psutil.cpu_times()) """ scputimes(user=84732.10937499999,? ??????????system=37132.85937500023,? ??????????idle=2003964.1249999998,? ??????????interrupt=3500.765625,? ??????????dpc=1089.6875) """ #?還有一個(gè)?psutil.cpu_times_percent()? #?功能與之類(lèi)似,?只不過(guò)返回的是比例
該函數(shù)返回的是一個(gè) namedtuple,后面凡是結(jié)構(gòu)長(zhǎng)的和這里類(lèi)似的,都是 namedtuple。補(bǔ)充一下,如果你的程序中需要?jiǎng)?chuàng)建大量的對(duì)象,并且該對(duì)象的屬性固定不變,那么不妨使用 namedtuple,相比使用字典,能節(jié)省大量空間。
查看 CPU 的使用率
import?psutil for?x?in?range(3): ????# interval:表示每隔?0.5s 刷新一次 ????# percpu:為 True 表示查看所有的 cpu 使用率 ????print(psutil.cpu_percent(interval=0.5,?percpu=True)) """ [9.1,?3.1,?12.5,?3.1,?15.6,?0.0,?6.2,?0.0,?12.5,?50.0,?9.4,?3.1] [9.1,?6.2,?12.5,?6.2,?3.1,?0.0,?0.0,?3.1,?0.0,?15.6,?3.1,?0.0] [0.0,?0.0,?15.6,?0.0,?6.2,?0.0,?6.2,?25.0,?3.1,?9.4,?6.2,?0.0] """ #?我這里?cpu?的邏輯數(shù)量是?12 #?所以每個(gè)列表里面有?12?個(gè)元素
查看 CPU 的統(tǒng)計(jì)信息
包括上下文切換、中斷、軟中斷,以及系統(tǒng)調(diào)用次數(shù)等等。
import?psutil print(psutil.cpu_stats()) """ scpustats(ctx_switches=3346512902,? ??????????interrupts=2288572793,? ??????????soft_interrupts=0,? ??????????syscalls=3324041552) """
查看 CPU 的頻率
import?psutil print(psutil.cpu_freq()) """ scpufreq(current=2208.0,?min=0.0,?max=2208.0) """
內(nèi)存相關(guān)
查看內(nèi)存使用情況
import?psutil print(psutil.virtual_memory()) """ svmem(total=17029259264,? ??????available=7698505728,? ??????percent=54.8,? ??????used=9330753536,? ??????free=7698505728) """
total 表示總內(nèi)存,available 表示可用內(nèi)存,percent 表示內(nèi)存使用率,used 表示已使用的內(nèi)存,free 表示可用內(nèi)存。
所以 available 加上 used 等于 total,used 除以 total 再乘以 100 等于 percent。
查看交換內(nèi)存信息
import?psutil print(psutil.swap_memory()) """ sswap(total=3087007744,? ??????used=4509839360,? ??????free=-1422831616,? ??????percent=146.1,? ??????sin=0,? ??????sout=0) """
說(shuō)到內(nèi)存,有物理內(nèi)存、交換內(nèi)存、虛擬內(nèi)存,這三者有什么區(qū)別呢?用大白話解釋就是:
1)物理內(nèi)存是實(shí)際的內(nèi)存條提供的臨時(shí)數(shù)據(jù)存儲(chǔ)空間,在 Windows 上右鍵點(diǎn)擊計(jì)算機(jī),再點(diǎn)擊屬性時(shí),上面顯示的安裝內(nèi)存(RAM)就是電腦的物理內(nèi)存。這些內(nèi)存是實(shí)際存在的,在你不給機(jī)器增加內(nèi)存條的時(shí)候是不會(huì)改變的。
2)交換內(nèi)存通常在頁(yè)面調(diào)度和交換進(jìn)程數(shù)據(jù)時(shí)使用,相當(dāng)于在進(jìn)行內(nèi)存整理的時(shí)候,會(huì)先把部分?jǐn)?shù)據(jù)放在硬盤(pán)的某塊區(qū)域。類(lèi)似我們整理衣柜,衣服一多直接整理會(huì)很麻煩,因此會(huì)先把部分衣服拿出來(lái)放在其它地方,等衣柜里的衣服整理完了,再把放在其它地方的衣服拿回來(lái)。
這個(gè)其它地方在計(jì)算機(jī)中則代表硬盤(pán)的某塊區(qū)域,也就是我們所說(shuō)的交換區(qū)。通常使用交換內(nèi)存是因?yàn)槲锢韮?nèi)存不足導(dǎo)致的,正所謂衣柜,如果足夠大的話就沒(méi)必要拿出部分衣服放在其它地方, 直接在衣柜里就能解決了。
3)最后是虛擬內(nèi)存,當(dāng)操作文件,可執(zhí)行程序等等,那么首先要把它們從磁盤(pán)讀取到內(nèi)存中,因此 CPU 除了自己那一部分小小的空間外,要想操作數(shù)據(jù),只能操作內(nèi)存里的數(shù)據(jù)。
但是當(dāng)內(nèi)存不夠了,那么會(huì)在硬盤(pán)上開(kāi)辟一份虛擬內(nèi)存,將物理內(nèi)存里的部分?jǐn)?shù)據(jù)放在虛擬內(nèi)存當(dāng)中。硬盤(pán)的空間很大,即使普通電腦安裝的固態(tài)硬盤(pán)也有一百個(gè) G,因此可以拿出一部分充當(dāng)虛擬內(nèi)存。
不過(guò)虛擬內(nèi)存雖說(shuō)是內(nèi)存,但畢竟在硬盤(pán)上,速度和 CPU 直接從物理內(nèi)存里讀取數(shù)據(jù)相差甚遠(yuǎn)。這也是為什么要將經(jīng)常被訪問(wèn)的熱點(diǎn)數(shù)據(jù)放在 Redis 緩存里,而不是放在硬盤(pán)或者數(shù)據(jù)庫(kù)上。
磁盤(pán)相關(guān)
查看磁盤(pán)分區(qū)、磁盤(pán)使用率和磁盤(pán) IO 信息
import?psutil print(psutil.disk_partitions()) """ [sdiskpart(device='C:\\',?mountpoint='C:\\',?fstype='NTFS',?opts='rw,fixed',?maxfile=255,?maxpath=260), ?sdiskpart(device='D:\\',?mountpoint='D:\\',?fstype='NTFS',?opts='rw,fixed',?maxfile=255,?maxpath=260), ?sdiskpart(device='E:\\',?mountpoint='E:\\',?fstype='NTFS',?opts='rw,fixed',?maxfile=255,?maxpath=260)] """
可以看到一共有三個(gè)盤(pán)符,fstype 表示文件系統(tǒng)類(lèi)型,這里是 NTFS;opts 中的 rw 表示可讀寫(xiě)。
該函數(shù)還可以接收一個(gè)參數(shù) all,默認(rèn)為 False。如果指定為 True,在 Linux 上返回的內(nèi)容還會(huì)包含 /proc 等特殊文件系統(tǒng)的掛載信息。由于我這里是 Windows,所以?xún)烧邲](méi)區(qū)別。
查看某個(gè)磁盤(pán)使用情況
import?psutil print(psutil.disk_usage("C:\\")) """ sdiskusage(total=267117391872,? ???????????used=96894304256,? ???????????free=170223087616,? ???????????percent=36.3) """
查看磁盤(pán) IO 統(tǒng)計(jì)信息
import?psutil print(psutil.disk_io_counters()) """ sdiskio(read_count=1172461,? ????????write_count=2153031,? ????????read_bytes=36854982144,? ????????write_bytes=52718300160,? ????????read_time=551,? ????????write_time=1437) """
- read_count :讀次數(shù)
- write_count:寫(xiě)次數(shù)
- read_bytes:讀的字節(jié)數(shù)
- write_bytes:寫(xiě)的字節(jié)數(shù)
- read_time:讀時(shí)間
- write_time:寫(xiě)時(shí)間
以上返回的是所有磁盤(pán)加起來(lái)的統(tǒng)計(jì)信息,我們可以指定 perdisk=True,分別列出每一個(gè)分區(qū)的統(tǒng)計(jì)信息。
網(wǎng)絡(luò)相關(guān)
查看網(wǎng)卡的網(wǎng)絡(luò) IO 統(tǒng)計(jì)信息
import?psutil print(psutil.net_io_counters()) """ snetio(bytes_sent=175995567,? ???????bytes_recv=2849015622,? ???????packets_sent=1052206,? ???????packets_recv=3050302,? ???????errin=0,? ???????errout=0,? ???????dropin=3491,? ???????dropout=0) """ #?bytes_sent:?發(fā)送的字節(jié)數(shù) #?bytes_recv:?接收的字節(jié)數(shù) #?packets_sent:?發(fā)送的包數(shù)據(jù)量 #?packets_recv:?接收的包數(shù)據(jù)量 #?errin:?接收包時(shí),?出錯(cuò)的次數(shù) #?errout:?發(fā)送包時(shí),?出錯(cuò)的次數(shù) #?dropin:?接收包時(shí),?丟棄的次數(shù) #?dropout:?發(fā)送包時(shí),?丟棄的次數(shù) #?里面還有一個(gè)?pernic?參數(shù) #?如果為?True,?則列出所有網(wǎng)卡的信息 print(psutil.net_io_counters(pernic=True)) """ {'以太網(wǎng)':?snetio(bytes_sent=178716616,? ?????????????????bytes_recv=2866823348,? ?????????????????packets_sent=1058190,? ?????????????????packets_recv=3102852,? ?????????????????errin=0,?errout=0,? ?????????????????dropin=3491,?dropout=0),? 'WLAN':?snetio(bytes_sent=0,?bytes_recv=0,? ???????????????packets_sent=0,?packets_recv=0,? ???????????????errin=0,?errout=0,? ???????????????dropin=0,?dropout=0),? '本地連接*?3':?snetio(bytes_sent=0,?bytes_recv=0,? ????????????????????packets_sent=0,?packets_recv=0,? ????????????????????errin=0,?errout=0,? ????????????????????dropin=0,?dropout=0),? '本地連接*?4':?snetio(bytes_sent=0,?bytes_recv=0,? ?????????????????????packets_sent=0,?packets_recv=0, ?????????????????????errin=0,?errout=0,? ?????????????????????dropin=0,?dropout=0),? '藍(lán)牙網(wǎng)絡(luò)連接':?snetio(bytes_sent=0,?bytes_recv=0,? ????????????????????packets_sent=0,?packets_recv=0, ????????????????????errin=0,?errout=0,? ????????????????????dropin=0,?dropout=0),? 'Loopback?Pseudo-Interface?1':?snetio(bytes_sent=0,? ??????????????????????????????????????bytes_recv=0,? ??????????????????????????????????????packets_sent=0,? ??????????????????????????????????????packets_recv=0,? ??????????????????????????????????????errin=0,?errout=0,? ??????????????????????????????????????dropin=0,?dropout=0)} """
查看網(wǎng)絡(luò)接口信息
import?psutil #?以字典的形式返回網(wǎng)卡的配置信息 #?包括?IP?地址、Mac地址、子網(wǎng)掩碼、廣播地址等等 print(psutil.net_if_addrs()) """ {'以太網(wǎng)':?[ ????snicaddr(family=<AddressFamily.AF_LINK:?-1>,? ?????????????address='9C-7B-EF-15-FC-2F',?netmask=None,? ?????????????broadcast=None,?ptp=None),? ????snicaddr(family=<AddressFamily.AF_INET:?2>,? ?????????????address='192.168.4.150',?netmask='255.255.240.0',? ?????????????broadcast=None,?ptp=None),? ????snicaddr(family=<AddressFamily.AF_INET6:?23>,? ?????????????address='fe80::4826:a6a6:b5f4:3647',? ?????????????netmask=None,?broadcast=None,?ptp=None)],? 'WLAN':?[...],? '本地連接*?3':?[...],? '本地連接*?4':?[...],? '藍(lán)牙網(wǎng)絡(luò)連接':?[...],? 'Loopback?Pseudo-Interface?1':?[...]} """ #?返回網(wǎng)卡的詳細(xì)信息,?包括是否啟動(dòng)、通信類(lèi)型、傳輸速度、mtu print(psutil.net_if_stats()) """ {'以太網(wǎng)':?snicstats(isup=True,? ????????????????????duplex=<NicDuplex.NIC_DUPLEX_FULL:?2>,? ????????????????????speed=1000,?mtu=1500),? '藍(lán)牙網(wǎng)絡(luò)連接':?snicstats(isup=False,? ????????????????????????duplex=<NicDuplex.NIC_DUPLEX_FULL:?2>,? ????????????????????????speed=3,?mtu=1500),? 'Loopback?Pseudo-Interface?1':?snicstats(isup=True,? ?????????????????????????????????????????duplex=<NicDuplex.NIC_DUPLEX_FULL:?2>,? ?????????????????????????????????????????speed=1073,?mtu=1500),? 'WLAN':?snicstats(isup=False,? ??????????????????duplex=<NicDuplex.NIC_DUPLEX_FULL:?2>,? ??????????????????speed=0,?mtu=1500),? '本地連接*?3':?snicstats(isup=False,? ????????????????????????duplex=<NicDuplex.NIC_DUPLEX_FULL:?2>,? ????????????????????????speed=0,?mtu=1500),? '本地連接*?4':?snicstats(isup=False,? ????????????????????????duplex=<NicDuplex.NIC_DUPLEX_FULL:?2>,? ????????????????????????speed=0,?mtu=1500)} """
查看當(dāng)前機(jī)器的網(wǎng)絡(luò)連接
import?psutil #?以列表的形式返回每個(gè)網(wǎng)絡(luò)連接的詳細(xì)信息 #?里面接受一個(gè)參數(shù),?默認(rèn)是?"inet" #?當(dāng)然我們也可以指定為其它,?比如?"tcp" print(psutil.net_connections()) """ [sconn(fd=-1,?family=<AddressFamily.AF_INET:?2>,? ???????type=<SocketKind.SOCK_DGRAM:?2>,? ???????laddr=addr(ip='192.168.4.150',?port=137),? ???????raddr=(),?status='NONE',?pid=4), ?sconn(fd=-1,?family=<AddressFamily.AF_INET:?2>,? ???????type=<SocketKind.SOCK_DGRAM:?2>,? ???????laddr=addr(ip='127.0.0.1',?port=54872),? ???????raddr=(),?status='NONE',?pid=11652), ?sconn(fd=-1,?family=<AddressFamily.AF_INET:?2>,? ???????type=<SocketKind.SOCK_STREAM:?1>,? ???????laddr=addr(ip='192.168.4.150',?port=11253),? ???????raddr=addr(ip='117.50.19.136',?port=80),? ???????status='CLOSE_WAIT',?pid=11568), ?.... ?.... ?.... ] """
是不是很方便呢?在 Linux 中有兩個(gè)命令可以做到這一點(diǎn),分別是 netstat 和 ss。另外該函數(shù)會(huì)返回所有的連接信息,所以當(dāng)連接數(shù)很多的時(shí)候,會(huì)占用較高的內(nèi)存。
查看當(dāng)前登錄的用戶信息
import?psutil print(psutil.users()) """ [suser(name='satori',?terminal=None,?host='0.0.0.0',? ???????started=1609841661.0,?pid=None)] """
查看系統(tǒng)的啟動(dòng)時(shí)間
import?psutil from?datetime?import?datetime print(psutil.boot_time())??#?1654012221.2945454 print( ????datetime.fromtimestamp(psutil.boot_time()) )??#?2022-05-31?23:50:21.294545
進(jìn)程管理
psutil 還提供了很多和進(jìn)程管理相關(guān)的功能函數(shù),非常的豐富,我們來(lái)看一下。
查看當(dāng)前存在的所有進(jìn)程的 pid
import?psutil print(psutil.pids()) """ [0,?4,?148,?532,?668,?796,?904,?912,?976,?...] """
查看某個(gè)進(jìn)程是否存在
import?psutil print(psutil.pid_exists(22333))??#?False print(psutil.pid_exists(532))??#?True
返回所有進(jìn)程(Process)對(duì)象組成的迭代器
import?psutil print(psutil.process_iter()) """ <generator?object?process_iter?at?0x000...> """ #?遍歷的話,會(huì)得到每一個(gè)進(jìn)程對(duì)象 #?進(jìn)程對(duì)象在?psutil?里面的類(lèi)型是?Process
根據(jù) pid 獲取一個(gè)進(jìn)程對(duì)應(yīng)的 Process 對(duì)象
import?psutil print(psutil.Process(14124)) """ psutil.Process(pid=14124,?name='WeChat.exe',? ???????????????status='running',?started='10:54:43') """ #?進(jìn)程名稱(chēng)是?WeChat.exe,狀態(tài)為運(yùn)行中 #?啟動(dòng)時(shí)間是早上?10?點(diǎn)?54?分
進(jìn)程管理操作
我們說(shuō)根據(jù) pid 可以獲取一個(gè)進(jìn)程對(duì)應(yīng)的 Process 對(duì)象,而這個(gè)對(duì)象里面包含了該進(jìn)程的全部信息。
import?psutil p?=?psutil.Process(14124) #?進(jìn)程名稱(chēng) print(p.name()) """ WeChat.exe """ #?進(jìn)程的exe路徑 print(p.exe()) """ D:\WeChat\WeChat.exe """ #?進(jìn)程的工作目錄 print(p.cwd()) """ D:\WeChat """ #?進(jìn)程啟動(dòng)的命令行 print(p.cmdline()) """ ['D:\\WeChat\\WeChat.exe'] """ #?當(dāng)前進(jìn)程id print(p.pid) """ 14124 """ #?父進(jìn)程id print(p.ppid()) """ 8860 """ #?父進(jìn)程 print(p.parent()) """ psutil.Process(pid=8860,?name='explorer.exe',? ???????????????status='running',?started='10:53:58') """ #?子進(jìn)程列表 print(p.children()) """ [psutil.Process(pid=6852,?name='WechatBrowser.exe',? ????????????????status='running',?started='10:54:59'),? ?psutil.Process(pid=1960,?name='WeChatPlayer.exe', ????????????????status='running',?started='10:54:59'),? ?psutil.Process(pid=10432,?name='WeChatApp.exe',? ????????????????status='running',?started='10:55:33')] """ #?進(jìn)程狀態(tài) print(p.status()) """ running """ #?進(jìn)程用戶名 print(p.username()) """ LAPTOP-264ORES3\satori """ #?進(jìn)程創(chuàng)建時(shí)間,返回時(shí)間戳 print(p.create_time()) """ 1654570483.2370846 """ #?進(jìn)程終端 #?在windows上無(wú)法使用 try: ????print(p.terminal()) except?Exception?as?e: ????print(e) """ 'Process'?object?has?no?attribute?'terminal' """ #?進(jìn)程使用的cpu時(shí)間 print(p.cpu_times()) """ pcputimes(user=27.8125,?system=13.484375, ??????????children_user=0.0,?children_system=0.0) """ #?進(jìn)程所使用的的內(nèi)存 print(p.memory_info()) """ pmem(rss=110141440,?vms=116899840,? ?????num_page_faults=661356,?peak_wset=221048832,? ?????wset=110141440,?peak_paged_pool=834824,? ?????paged_pool=806216,?peak_nonpaged_pool=144584,? ?????nonpaged_pool=78560,?pagefile=116899840,? ?????peak_pagefile=197505024,?private=116899840) """ #?進(jìn)程打開(kāi)的文件 print(p.open_files()) #?進(jìn)程相關(guān)的網(wǎng)絡(luò)連接 print(p.connections()) """ [pconn(fd=-1,?family=<AddressFamily.AF_INET:?2>,? ???????type=<SocketKind.SOCK_STREAM:?1>,? ???????laddr=addr(ip='192.168.4.150',?port=7693),? ???????raddr=addr(ip='58.251.111.106',?port=8080),? ???????status='ESTABLISHED'),? ?pconn(fd=-1,?family=<AddressFamily.AF_INET:?2>,? ???????type=<SocketKind.SOCK_STREAM:?1>,? ???????laddr=addr(ip='127.0.0.1',?port=8680),? ???????raddr=(),?status='LISTEN')] """ #?進(jìn)程內(nèi)的線程數(shù)量,這個(gè)進(jìn)程開(kāi)啟了多少個(gè)線程 print(p.num_threads())??#?58 #?這個(gè)進(jìn)程內(nèi)的所有線程信息 print(p.threads()) """ [pthread(id=14128,?user_time=11.3125,?system_time=7.578125),? ?pthread(id=13428,?user_time=0.0,?system_time=0.0),? ?pthread(id=13616,?user_time=0.0,?system_time=0.0),? ?pthread(id=13600,?user_time=0.015625,?system_time=0.328125), ?pthread(id=7364,?user_time=0.078125,?system_time=0.015625), ?...? ?] """ #?進(jìn)程的環(huán)境變量 print(p.environ()) #?結(jié)束進(jìn)程 #?執(zhí)行之后微信就會(huì)被強(qiáng)制關(guān)閉,?這里就不試了 #?p.terminal()
我們還可以調(diào)用 psutil.test 來(lái)模擬 ps 命令。
import?psutil psutil.test()
輸出如下:
它是怎么做的呢?還記得我們之前說(shuō)的 process_iter 嗎?會(huì)返回所有進(jìn)程的 Process 對(duì)象,直接依次輸出里面的信息即可。同理,我們也可以通過(guò) process_iter 找到某一個(gè)進(jìn)程對(duì)應(yīng)的進(jìn)程 id。
import?psutil for?prcs?in?psutil.process_iter(): ????if?prcs.name().lower()?==?"wechat.exe": ????????print(prcs) """ psutil.Process(pid=14124,?name='WeChat.exe',? ???????????????status='running',?started='10:54:43') """
有了這個(gè)操作之后,我們便可以找到對(duì)應(yīng)的進(jìn)程,然后借助操作系統(tǒng)的 kernal 修改進(jìn)程內(nèi)部的數(shù)據(jù)。
到此這篇關(guān)于Python利用psutil實(shí)現(xiàn)獲取硬件,網(wǎng)絡(luò)和進(jìn)程信息的文章就介紹到這了,更多相關(guān)Python psutil獲取信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中文分詞工具之結(jié)巴分詞用法實(shí)例總結(jié)【經(jīng)典案例】
這篇文章主要介紹了Python中文分詞工具之結(jié)巴分詞用法,結(jié)合實(shí)例形式總結(jié)分析了Python針對(duì)中文文件的讀取與分詞操作過(guò)程中遇到的問(wèn)題與解決方法,需要的朋友可以參考下2017-04-04Python中Tkinter Scrollbar滾動(dòng)條(窗口滑動(dòng)條)
本文主要介紹了Python中Tkinter Scrollbar滾動(dòng)條(窗口滑動(dòng)條),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03python利用thrift服務(wù)讀取hbase數(shù)據(jù)的方法
今天小編就為大家分享一篇python利用thrift服務(wù)讀取hbase數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Python用for循環(huán)實(shí)現(xiàn)九九乘法表
本文通過(guò)實(shí)例代碼給大家介紹了Python用for循環(huán)實(shí)現(xiàn)九九乘法表的方法,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-05-05python實(shí)現(xiàn)飛機(jī)大戰(zhàn)微信小游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)飛機(jī)大戰(zhàn)微信小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09Python 識(shí)別12306圖片驗(yàn)證碼物品的實(shí)現(xiàn)示例
這篇文章主要介紹了Python 識(shí)別12306圖片驗(yàn)證碼物品的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01Python對(duì)小數(shù)進(jìn)行除法運(yùn)算的正確方法示例
這篇文章主要介紹了Python對(duì)小數(shù)進(jìn)行除法運(yùn)算的正確方法示例,正確的方法是需要轉(zhuǎn)換成浮點(diǎn)數(shù),否則永遠(yuǎn)不會(huì)得到正確結(jié)果,需要的朋友可以參考下2014-08-08