-
6个实用的Python自动化脚本详解每天你都可能会执行许多重复的任务,例如阅读 pdf、播放音乐、查看天气、打开书签、清理文件夹等等,使用自动化脚本,就无需手动一次又一次地完成这些任务,非常方便。快跟随小编一起试一试吧每天你都可能会执行许多重复的任务,例如阅读 pdf、播放音乐、查看天气、打开书签、清理文件夹等等,使用自动化脚本,就无需手动一次又一次地完成这些任务,非常方便。而在某种程度上,Python 就是自动化的代名词。今天分享 6 个非常有用的 Python 自动化脚本。1、将 PDF 转换为音频文件脚本可以将 pdf 转换为音频文件,原理也很简单,首先用 PyPDF 提取 pdf 中的文本,然后用 Pyttsx3 将文本转语音。关于文本转语音,你还可以看这篇文章FastAPI:快速开发一个文本转语音的接口。代码如下:import pyttsx3,PyPDF2 pdfreader = PyPDF2.PdfFileReader(open('story.pdf','rb')) speaker = pyttsx3.init() for page_num in range(pdfreader.numPages): text = pdfreader.getPage(page_num).extractText() ## extracting text from the PDF cleaned_text = text.strip().replace('\n',' ') ## Removes unnecessary spaces and break lines print(cleaned_text) ## Print the text from PDF #speaker.say(cleaned_text) ## Let The Speaker Speak The Text speaker.save_to_file(cleaned_text,'story.mp3') ## Saving Text In a audio file 'story.mp3' speaker.runAndWait() speaker.stop() 2、从列表中播放随机音乐这个脚本会从歌曲文件夹中随机选择一首歌进行播放,需要注意的是 os.startfile 仅支持 Windows 系统。import random, os music_dir = 'G:\\new english songs' songs = os.listdir(music_dir) song = random.randint(0,len(songs)) print(songs[song]) ## Prints The Song Name os.startfile(os.path.join(music_dir, songs[0])) 3、不再有书签了每天睡觉前,我都会在网上搜索一些好内容,第二天可以阅读。大多数时候,我把遇到的网站或文章添加为书签,但我的书签每天都在增加,以至于现在我的浏览器周围有100多个书签。因此,在python的帮助下,我想出了另一种方法来解决这个问题。现在,我把这些网站的链接复制粘贴到文本文件中,每天早上我都会运行脚本,在我的浏览器中再次打开所有这些网站。import webbrowser with open('./websites.txt') as reader: for link in reader: webbrowser.open(link.strip()) 代码用到了 webbrowser,是 Python 中的一个库,可以自动在默认浏览器中打开 URL。4、智能天气信息国家气象局网站提供获取天气预报的 API,直接返回 json 格式的天气数据。所以只需要从 json 里取出对应的字段就可以了。下面是指定城市(县、区)天气的网址,直接打开网址,就会返回对应城市的天气数据。比如:http://www.weather.com.cn/data/cityinfo/101021200.html上海徐汇区对应的天气网址。 具体代码如下:import requests import json import logging as log def get_weather_wind(url): r = requests.get(url) if r.status_code != 200: log.error("Can't get weather data!") info = json.loads(r.content.decode()) # get wind data data = info['weatherinfo'] WD = data['WD'] WS = data['WS'] return "{}({})".format(WD, WS) def get_weather_city(url): # open url and get return data r = requests.get(url) if r.status_code != 200: log.error("Can't get weather data!") # convert string to json info = json.loads(r.content.decode()) # get useful data data = info['weatherinfo'] city = data['city'] temp1 = data['temp1'] temp2 = data['temp2'] weather = data['weather'] return "{} {} {}~{}".format(city, weather, temp1, temp2) if __name__ == '__main__': msg = """**天气提醒**: {} {} {} {} 来源: 国家气象局 """.format( get_weather_city('http://www.weather.com.cn/data/cityinfo/101021200.html'), get_weather_wind('http://www.weather.com.cn/data/sk/101021200.html'), get_weather_city('http://www.weather.com.cn/data/cityinfo/101020900.html'), get_weather_wind('http://www.weather.com.cn/data/sk/101020900.html') ) print(msg) 运行结果如下所示:5、长网址变短网址有时,那些大URL变得非常恼火,很难阅读和共享,此脚可以将长网址变为短网址。import contextlib from urllib.parse import urlencode from urllib.request import urlopen import sys def make_tiny(url): request_url = ('http://tinyurl.com/api-create.php?' + urlencode({'url':url})) with contextlib.closing(urlopen(request_url)) as response: return response.read().decode('utf-8') def main(): for tinyurl in map(make_tiny, sys.argv[1:]): print(tinyurl) if __name__ == '__main__': main() 这个脚本非常实用,比如说有不是内容平台是屏蔽公众号文章的,那么就可以把公众号文章的链接变为短链接,然后插入其中,就可以实现绕过6、清理下载文件夹世界上最混乱的事情之一是开发人员的下载文件夹,里面存放了很多杂乱无章的文件,此脚本将根据大小限制来清理您的下载文件夹,有限清理比较旧的文件:import os import threading import time def get_file_list(file_path): #文件按最后修改时间排序 dir_list = os.listdir(file_path) if not dir_list: return else: dir_list = sorted(dir_list, key=lambda x: os.path.getmtime(os.path.join(file_path, x))) return dir_list def get_size(file_path): """[summary] Args: file_path ([type]): [目录] Returns: [type]: 返回目录大小,MB """ totalsize=0 for filename in os.listdir(file_path): totalsize=totalsize+os.path.getsize(os.path.join(file_path, filename)) #print(totalsize / 1024 / 1024) return totalsize / 1024 / 1024 def detect_file_size(file_path, size_Max, size_Del): """[summary] Args: file_path ([type]): [文件目录] size_Max ([type]): [文件夹最大大小] size_Del ([type]): [超过size_Max时要删除的大小] """ print(get_size(file_path)) if get_size(file_path) > size_Max: fileList = get_file_list(file_path) for i in range(len(fileList)): if get_size(file_path) > (size_Max - size_Del): print ("del :%d %s" % (i + 1, fileList[i])) #os.remove(file_path + fileList[i]) 原文链接:https://blog.csdn.net/m0_69043821/article/details/124701950
-
目录说明引言选择数据库couchdbcouchdb的安装数据库结构序列化持久化区块链迭代器CLI测试一下说明本文根据https://github.com/liuchengxu/blockchain-tutorial的内容,用python实现的,但根据个人的理解进行了一些修改,大量引用了原文的内容。文章末尾有"本节完整源码实现地址"。引言到目前为止,我们已经构建了一个有工作量证明机制的区块链。有了工作量证明,挖矿也就有了着落。虽然目前距离一个有着完整功能的区块链越来越近了,但是它仍然缺少了一些重要的特性。在今天的内容中,我们会将区块链持久化到一个数据库中,然后会提供一个简单的命令行接口,用来完成一些与区块链的交互操作。本质上,区块链是一个分布式数据库,不过,我们暂时先忽略 “分布式” 这个部分,仅专注于 “存储” 这一点。选择数据库目前,我们的区块链实现里面并没有用到数据库,而是在每次运行程序时,简单地将区块链存储在内存中。那么一旦程序退出,所有的内容就都消失了。我们没有办法再次使用这条链,也没有办法与其他人共享,所以我们需要把它存储到磁盘上。那么,我们要用哪个数据库呢?实际上,任何一个数据库都可以。在 比特币原始论文 中,并没有提到要使用哪一个具体的数据库,它完全取决于开发者如何选择。 Bitcoin Core ,最初由中本聪发布,现在是比特币的一个参考实现,它使用的是 LevelDB。而我们将要使用的是…couchdb因为它:简单易用有一个web的UI界面,方便我们查看丰富的查询支持良好的python支持couchdb的安装直接安装,参考https://www.jb51.net/article/202914.htmdocker版couchdb安装,使用docker-compose安装couchdb1234567# couchdb.yamlversion: '2'services: couchdb: image: hyperledger/fabric-couchdb ports: - 5984:5984执行docker-compose -f couchdb.yaml up -d即可安装。使用http://ip:5984/_utils即可访问couchdb的后台管理系统。数据库结构在开始实现持久化的逻辑之前,我们首先需要决定到底要如何在数据库中进行存储。为此,我们可以参考 Bitcoin Core 的做法:简单来说,Bitcoin Core 使用两个 “bucket” 来存储数据:其中一个 bucket 是 blocks,它存储了描述一条链中所有块的元数据另一个 bucket 是 chainstate,存储了一条链的状态,也就是当前所有的未花费的交易输出,和一些元数据此外,出于性能的考虑,Bitcoin Core 将每个区块(block)存储为磁盘上的不同文件。如此一来,就不需要仅仅为了读取一个单一的块而将所有(或者部分)的块都加载到内存中。而我们直接使用couchdb。在 blocks 中,key -> value 为:keyvalueb + 32 字节的 block hashblock index recordf + 4 字节的 file numberfile information recordl + 4 字节的 file numberthe last block file number usedR + 1 字节的 boolean是否正在 reindexF + 1 字节的 flag name length + flag name string1 byte boolean: various flags that can be on or offt + 32 字节的 transaction hashtransaction index record在 chainstate,key -> value 为:keyvaluec + 32 字节的 transaction hashunspent transaction output record for that transactionB32 字节的 block hash: the block hash up to which the database represents the unspent transaction outputs详情可见 这里。因为目前还没有交易,所以我们只需要 blocks bucket。另外,正如上面提到的,我们会将整个数据库存储为单个文件,而不是将区块存储在不同的文件中。所以,我们也不会需要文件编号(file number)相关的东西。最终,我们会用到的键值对有:32 字节的 block-hash(转换为16进制字符串) -> block 结构l -> 链中最后一个块的 hash(转换为16进制字符串)这就是实现持久化机制所有需要了解的内容了。序列化为了方便我们查看,这里我们不直接使用二进制数据,而将其转换为16进制字符串。所以我们需要对区块内容进行序列化。让我们来实现 Block 的 Serialize 方法:1234567# class Blockdef serialize(self): return { "magic_no": self._magic_no, "block_header": self._block_header.serialize(), "transactions": self._transactions }直接返回我们需要的数据构成的字典即可,而block_header则需要进一步序列化。它的序列化同样也只需要返回具体的数据字典即可,如下:123# class BlockHeaderdef serialize(self): return self.__dict__反序列化则是把信息转换为区块对象。1234567# class Block @classmethod def deserialize(cls, data): block_header_dict = data['block_header'] block_header = BlockHeader.deserialize(block_header_dict) transactions = data["transactions"] return cls(block_header, transactions)首先反序列化块,然后构造成一个对象,反序列化Header:12345678910111213# class BlockHeader @classmethod def deserialize(cls, data): timestamp = data.get('timestamp', '') prev_block_hash = data.get('pre_block_hash', '') # hash = data.get('hash', '') hash_merkle_root = data.get('hash_merkle_root', '') height = data.get('height', '') nonce = data.get('nonce', '') block_header = cls(hash_merkle_root, height, prev_block_hash) block_header.timestamp = timestamp block_header.nonce = nonce return block_header持久化持久化要做的事情就是把区块数据写入到数据库中,则我们要做的事情有:检查数据库是否已经有了一个区块链如果没有则创建一个,创建创世块并将l指向这个块的哈希添加一个区块,将l指向新添加的区块哈希创建创世块如下:1234567# class BlockChain: def new_genesis_block(self): if 'l' not in self.db: genesis_block = Block.new_genesis_block('genesis_block') genesis_block.set_header_hash() self.db.create(genesis_block.block_header.hash, genesis_block.serialize()) self.set_last_hash(genesis_block.block_header.hash)添加一个区块如下:1234567891011121314def add_block(self, transactions): """ add a block to block_chain """ last_block = self.get_last_block() prev_hash = last_block.get_header_hash() height = last_block.block_header.height + 1 block_header = BlockHeader('', height, prev_hash) block = Block(block_header, transactions) block.mine() block.set_header_hash() self.db.create(block.block_header.hash, block.serialize()) last_hash = block.block_header.hash self.set_last_hash(last_hash)对couchdb的操作的简单封装如下:12345678910111213141516171819202122232425class DB(Singleton): def __init__(self, db_server_url, db_name='block_chain'): self._db_server_url = db_server_url self._server = couchdb.Server(self._db_server_url) self._db_name = db_name self._db = None @property def db(self): if not self._db: try: self._db = self._server[self._db_name] except couchdb.ResourceNotFound: self._db = self._server.create(self._db_name) return self._db def create(self, id, data): self.db[id] = data return id def __getattr__(self, name): return getattr(self.db, name) def __contains__(self, name): return self.db.__contains__(name) def __getitem__(self, key): return self.db[key] def __setitem__(self, key, value): self.db[key] = value区块链迭代器由于我们现在使用了数据库存储,不再是数组,那么我们便失去了迭代打印区块链的特性,我们需要重写__getitem__以获得该特性,实现如下:12345678# class BlockChain(object): def __getitem__(self, index): last_block = self.get_last_block() height = last_block.block_header.height if index <= height: return self.get_block_by_height(index) else: raise IndexError('Index is out of range')123456789101112# class BlockChain(object): def get_block_by_height(self, height): """ Get a block by height """ query = {"selector": {"block_header": {"height": height}}} docs = self.db.find(query) block = Block(None, None) for doc in docs: block.deserialize(doc) break return block根据区块高度获取对应的区块,此处是利用了couchdb的mongo_query的富查询来实现。CLI到目前为止,我们的实现还没有提供一个与程序交互的接口。是时候加上交互了:这里我们使用argparse来解析参数:1234567891011121314151617181920212223242526272829def new_parser(): parser = argparse.ArgumentParser() sub_parser = parser.add_subparsers(help='commands') # A print command print_parser = sub_parser.add_parser( 'print', help='Print all the blocks of the blockchain') print_parser.add_argument('--print', dest='print', action='store_true') # A add command add_parser = sub_parser.add_parser( 'addblock', help='Print all the blocks of the blockchain') add_parser.add_argument( '--data', type=str, dest='add_data', help='block data') return parserdef print_chain(bc): for block in bc: print(block)def add_block(bc, data): bc.add_block(data) print("Success!")def main(): parser = new_parser() args = parser.parse_args() bc = BlockChain() if hasattr(args, 'print'): print_chain(bc) if hasattr(args, 'add_data'): add_block(bc, args.add_data)if __name__ == "__main__": main()测试一下1234567891011# 创世块创建$python3 main.pyMining a new blockFound nonce == 19ash_hex == 047f213bcb01f1ffbcdfafad57ffeead0e86924cf439594020da47ff2508291c<Document 'l'@'191-2f44a1493638684d9e000d8dd105192a' {'hash': 'e4f7adac65bcbb304af21be52a1b52bb28c0205a3746d63453d9e8c182de927a'}>Mining a new blockFound nonce == 1ash_hex == 0df1ac18c84a8e524d6fe49cb04aae9af02dd85addc4ab21ac13f9d0d7ffe769<Document 'l'@'192-168ff7ea493ca53c66690985deb5b7ac' {'hash': '01015004e21d394b1a6574eb81896e1c800f18aa22997e96b79bca22f7821a67'}>Block(_block_header=BlockHeader(timestamp='1551317137.2814202', hash_merkle_root='', prev_block_hash='', hash='f20f3c74c831d03aaa2291af23e607896a61809b5ced222483b46795a456a1c5', nonce=None, height=0))Block(_block_header=BlockHeader(timestamp='1551317137.358466', hash_merkle_root='', prev_block_hash='f20f3c74c831d03aaa2291af23e607896a61809b5ced222483b46795a456a1c5', hash='e4f7adac65bcbb304af21be52a1b52bb28c0205a3746d63453d9e8c182de927a', nonce=19, height=1))Block(_block_header=BlockHeader(timestamp='1551317137.4621542', hash_merkle_root='', prev_block_hash='e4f7adac65bcbb304af21be52a1b52bb28c0205a3746d63453d9e8c182de927a', hash='01015004e21d394b1a6574eb81896e1c800f18aa22997e96b79bca22f7821a67', nonce=1, height=2))12345$python3 cli.py addblock --data datasMining a new blockFound nonce == 6ash_hex == 0864df4bfbb2fd115eeacfe9ff4d5813754198ba261c469000c29b74a1b391c5<Document 'l'@'193-92e02b894d09dcd64f8284f141775920' {'hash': '462ac519b6050acaa78e1be8c2c8de298b713a2e138d7139fc882f7ae58dcc88'}>Success!一切正常工作。
-
本文实例为大家分享了Python实现环形链表的具体代码,供大家参考,具体内容如下我们将单向链表的最后一个节点的指针指向链表的头部(第一个节点),那么就形成了一个环形链表。环形节点可以从任意节点开始遍历其他的节点。这里主要实现了环形链表节点的遍历、添加、插入、删除,反转。代码如下:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106class Player: """节点类""" def __init__(self): """初始化姓名,分数,指针""" self.name = '' self.score = 0 self.next = None def ergodic(head, num=None, is_print=False): """遍历函数,num是遍历到哪一个位置序号,is_print是否触发打印方法""" if head.next is None: return None ptr = head count = 0 while True: count += 1 if is_print: print('No.'+str(count), ptr.name, ptr.score, '--->', ptr.next.name) if count == num: break if ptr.next == head: break ptr = ptr.next return ptr # 返回遍历完成后的最后一个节点 def invert(x): # x是链表的第一个节点 """反转环形链表""" y = x.next # y是x原来的next x.next = ergodic(x) # 将第一个节点的next指向最后一个节点(因为反转了) while True: # 循环反转后面的所有节点 r = y.next y.next = x if r == head: # r是head说明y已经是原本链表的最后一个节点了 return y # 返回y,这个y是反转后的链表的第一个节点 x = y y = r head = Player()ptr = head while True: select = input("(1).新增 (2).查看 (3).插入 (4).删除 (5).反转 (6).离开\n输入:") if select == "1": # 新增节点 ptr = ergodic(head) # 获取当前链表最后一个节点 if ptr is None: # ptr为None说明当前在添加第一个节点head head.name = input("姓名:") head.score = input("分数:") head.next = head else: # 添加第一个节点之后的节点 next_data = Player() next_data.name = input("姓名:") next_data.score = input("分数:") next_data.next = head ptr.next = next_data elif select == "2": # 遍历查看链表所有节点 ergodic(head, is_print=True) # 遍历链表,将打印参数设为True elif select == '3': # 向链表中任意位置插入节点,位置以序号表示,即第一个节点序号为1,第二个节点序号为2,以此类推 try: num = int(input("请输入需要插入的节点位置序号:")) # 输入序号必须是大于0的正整数,如果输入大于最后一个节点的序号则插入到最后一个节点之后 if num < 1: print("输入必须为大于0的正整数") continue except ValueError: print("输入有误") continue ptr = ergodic(head, num-1) # 获取需要插入位置的前一个节点 insert_data = Player() insert_data.name = input("姓名:") insert_data.score = input("分数:") insert_data.next = ptr.next ptr.next = insert_data if num == 1: # 如果插入位置是1的话,那么head将发生变化 head = insert_data elif select == '4': # 删除链表中任意位置的节点 try: num = int(input("请输入需要删除的节点位置序号:")) # 输入序号必须是大于0的正整数,如果输入大于最后一个节点的序号则删除最后一个节点 if num < 1: print("输入必须为大于0的正整数") continue except ValueError: print("输入有误") continue ptr = ergodic(head, num - 1) # 获取需要删除位置的前一个节点 if ptr == ergodic(head, num): # 输入序号过大时需要做特殊处理,因为输入序号过大也代表删除最后一个节点,那么这时我需要获取这最后一个节点的前一个节点 ptr = ergodic(ptr) ptr.next = ptr.next.next if num == 1: # 如果删除位置是1的话,那么head将发生变化 head = ptr.next elif select == '5': # 反转链表 new_first = invert(head) # 获取新的第一个节点 head = new_first # head指向新的第一个节点 print('成功反转') elif select == '6': print("成功离开") break else: print("输入错误,请重试")
-
1. 引言2. 浅拷贝2.1 问题引入2.2 问题剖析3. 深拷贝3.1 举个栗子3.2 探究原因4. 技巧总结4.1 判断是否指向同一内存4.2 其他数据类型5. 总结1. 引言深拷贝和浅拷贝是Python中重要的概念,本文重点介绍在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理。闲话少说,我们直接开始吧!2. 浅拷贝2.1 问题引入我们来举个栗子,如下所示我们有两个数组a和b,样例代码如下:12345import numpy as npa = np.array([1, 2, 3])b = aprint('a =', a)print('b =', b)输出如下:a = [1 2 3]b = [1 2 3]此时如果我们对数组a做如下改变,代码如下:123456import numpy as npa = np.array([1, 2, 3])b = aa [0] = 42print('a =', a)print('b =', b)那么我们的问题为: 此时b的值应该为多少?运行上述代码后,我们得到输出如下:a = [42 2 3]b = [42 2 3]2.2 问题剖析也许有人会觉得输出应该为??a=[42 2 3]?? 和 ??b=[1 2 3]?? ,但是运行上述代码后我们发现??a??和??b??的值均发生了相应的改变。这主要是由于在??Numpy??中对变量的赋值操作,实际上发生的为浅拷贝。换句话说,此时两个变量指向同一块内存地址,如下所示:所以,此时如果我们修改数组??original_array??中的某个元素,`copy_array??由于和??original_array`公用同一块内存,所以其中的元素也会发生相应的变化。3. 深拷贝3.1 举个栗子如果我们想要对??Numpy??数组执行深拷贝,此时我们可以使用函数??copy()??。相关的样例代码如下:12345import numpy as npa = np.array([1, 2, 3])b = a.copy()print('a =', a)print('b =', b)输出如下:a = [1 2 3]b = [1 2 3]此时,如果我们改变数组??a??中的元素,代码如下:123456import numpy as npa = np.array([1, 2, 3])b = a.copy()a [0] = 42print('a =', a)print('b =', b)此时的代码输出如下:a = [42 2 3]b = [1 2 3]3.2 探究原因观察上述输出,我们可以清楚地看到数组??a??发生了改变而数组??b??没有发生变化,这是由于我们使用了深拷贝。此时的内存地址如下:由于 ??original_array??和??copy_array??指向不同的内存地址空间,所以此时我们对??original_array??的改变并不会对??copy_array??带来影响。4. 技巧总结经过上述对深拷贝和浅拷贝的举例和示例,相信大家都已有了清晰的认识,接着我们对上述知识点进行总结,归纳如下:4.1 判断是否指向同一内存如果我们需要知道两个变量是否指向同一块内存地址,我们可以方便地使用??is??操作。浅拷贝示例:123a = np.array([1, 2, 3])b = aprint(b is a)输出如下:True深拷贝示例:123a = np.array([1, 2, 3])b = a.copy()print(b is a)输出如下:False4.2 其他数据类型尽管本文中所有的示例都使用了NumPy数组,但本文中所涉及的知识也适用于Python中的列表和字典等其他数据类型。总之,我们需要时刻记载心中:在浅拷贝中,原始数组和新的数组共同执行同一块内存;同时在深拷贝中,新的数组是原始数据的单独的拷贝,它指向一块新的内存地址。
-
目录1. 引言2. 举个栗子3. 使用Random库3.1 随机下标3.2 随机选择单个元素3.3 随机选择多个元素4. 使用Secrets库4.1 随机下标4.2 随机选择单个元素4.3 随机选择多个元素5. 总结1. 引言在本文中,我们将研究从列表中选择随机元素的不同实现方法。在日常项目中,我们经常会遇到这种情形,比如随机从多种数据增强策略中选择一种或几种来提升训练数据的多样性。闲话少说,我们直接开始吧。 :)2. 举个栗子为了方便示例,这里我们假设有一个包含多个水果英文名的列表,并且我们需要从中选择一种随机水果进行输出。水果名称列表如下所示:fruit_name_list = ['apple','orange','banana','pear','watermelon']3. 使用Random库random 库是一个 python的内置库,因此我们不需要重新安装它,可以方便地直接导入。这里我们将研究使用该库从列表中选择随机元素的 3 种不同方法。3.1 随机下标函数random.randrange(num_items)用于返回介于区间0到num_items-1之间的一个随机数,如果我们得到一个列表的随机下标,进而我们就可以方便的得到该列表中的一个随机元素。样例代码如下:import randomnum_items = len(fruit_name_list)random_index = random.randrange(num_items)winner = fruit_name_list[random_index]print(winner)输出如下:orange3.2 随机选择单个元素函数random.choice 将列表作为输入参数,并从列表中返回一个随机元素。在上述的例子中,我们可以直接传递 列表fruit_name_list作为该函数的参数。样例代码如下:12winner = random.choice(fruit_name_list)print(winner)输出如下:watermelon3.3 随机选择多个元素函数random.sample功能类似于函数random.choice,主要区别在于我们可以指定所需的随机元素的数量。在下面的代码样例中,我们可以得到两个随机的水果英文名字。 random.sample 返回值为一个列表。样例代码如下:winners = random.sample(fruit_name_list,2)print(winners)
-
单向链表每个节点都是由两部分组成:数据字段和指针,指针指向下一个元素在内存中的位置。单向链表的第一个节点节点是链表头指针,而最后一个节点的指针设为None,不指向任何元素。(链表头指针相当重要!!!)使用Python实现单向链表,我们可以使用一个节点类来封装节点,每创建一个节点就生成一个节点类的实例。这里主要实现了单向链表节点的遍历、添加、插入、删除,反转。代码如下:class Player: """节点类""" def __init__(self): """初始化姓名,分数,指针""" self.name = '' self.score = 0 self.next = None def ergodic(head, num=None, is_print=False): """遍历函数,num是遍历到哪一个位置序号,is_print是否触发打印方法""" ptr = head count = 0 while True: if num == count: break if ptr.next: count += 1 ptr = ptr.next if is_print: print('No.'+str(count), ptr.name, ptr.score, '--->', ptr.next.name if ptr.next else None) else: break return ptr # 返回遍历完成后的最后一个节点 def invert(x): # x是链表的第一个节点(即head的指针的指向) """反转链表""" y = x.next # y是x原来的next if y is None: # y等于None表示当前链表只有一个节点 return x x.next = None # 将第一个节点的next指向None(因为反转了) while True: # 循环反转后面的所有节点 r = y.next y.next = x if r is None: # r是None说明y已经是原本链表的最后一个节点了 return y # 返回y,这个y是反转后的链表的第一个节点 x = y y = r head = Player() while True: select = input("(1).新增 (2).查看 (3).插入 (4).删除 (5).反转 (6).离开\n输入:") if select == "1": # 新增节点 ptr = ergodic(head) # 获取当前链表最后一个节点 next_data = Player() # 创建一个新节点 next_data.name = input("姓名:") next_data.score = input("分数:") next_data.next = None ptr.next = next_data # 连接节点 elif select == "2": # 遍历查看链表所有节点 print("所有数据显示如下:") ergodic(head, is_print=True) # 遍历链表,将打印参数设为True elif select == '3': # 向链表中任意位置插入节点,位置以序号表示,即第一个节点序号为1,第二个节点序号为2,以此类推 try: num = int(input("请输入需要插入的节点位置序号:")) # 输入序号必须是大于0的正整数,如果输入大于最后一个节点的序号则插入到最后一个节点之后 if num < 1: print("输入必须为大于0的正整数") continue except ValueError: print("输入有误") continue ptr = ergodic(head, num-1) # 获取需要插入位置的前一个节点 insert_data = Player() insert_data.name = input("姓名:") insert_data.score = input("分数:") insert_data.next = ptr.next ptr.next = insert_data elif select == '4': # 删除链表中任意位置的节点 try: num = int(input("请输入需要删除的节点位置序号:")) # 输入序号必须是大于0的正整数,如果输入大于最后一个节点的序号则删除最后一个节点 if num < 1: print("输入必须为大于0的正整数") continue except ValueError: print("输入有误") continue ptr = ergodic(head, num - 1) # 获取需要删除位置的前一个节点 ptr.next = ptr.next.next elif select == '5': # 反转链表 new_first = invert(head.next) # 获取新的第一个节点 head.next = new_first # head指向新的第一个节点 print('成功反转') elif select == '6': print("成功离开") break else: print("输入错误,请重试")
-
链接:https://bbs.huaweicloud.com/blogs/354508【摘要】 本文将采用Anaconda+VsCode+JupyterNotebook的方案,环境安装完毕后,将拥有Python运行环境、常见的Python库例如python三剑客:Numpy、matplotlib、pandas、机器学习库sklearn全都有了。这是机器未来的第5篇文章写在前面:博客简介:专注AIoT领域,追逐未来时代的脉搏,记录路途中的技术成长!专栏简介:本专栏的核心就是:快!快!快!2周快速拿下Python,具备项目开发能力,为机器学习和深度学习做准备。面向人群:零基础编程爱好者专栏计划:接下来会逐步发布跨入人工智能的系列博文,敬请期待Python零基础快速入门系列快速入门Python数据科学系列人工智能开发环境搭建系列机器学习系列物体检测快速入门系列自动驾驶物体检测系列…@toc1. 概述目前主流的Python开发IDE主要有PyCharm、JupterNotebook,VsCode等,以前主流时PyCharm,随着VsCode插件的丰富,目前VsCode已经成为主流的顶流了。本文将采用Anaconda+VsCode+JupyterNotebook的方案,环境安装完毕后,将拥有Python运行环境、常见的Python库例如python三剑客:Numpy、matplotlib、pandas、机器学习库sklearn全都有了。2. 安装Anaconda2.1 概述Anaconda,中文大蟒蛇,是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。其简化了python软件包的安装,并且自动关联依赖,自动下载依赖的软件包,避免不必要的冲突,另外,anaconda最重要的功能就是创建虚拟环境,实现各种项目开发框架及版本的隔离。2.2 下载anacondaAnaconda的官方下载速度较慢,推荐使用清华大学的源下载,尽量选择日期较新的版本,根据操作系统版本选择对应的版本。官方下载地址:https://www.anaconda.com/国内下载地址:清华大学 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/2.3 安装Anaconda注意事项:不要有中文路径,安装过程无脑下一步即可。安装完毕之后,python、pip等软件均已安装完毕。2.4 测试Anaconda在命令提示符输入conda -V查看conda版本,以确认conda环境是否生效。PS C:\Users\zhoushimin> conda -V conda 4.10.32.5 配置Anaconda由于Anaconda官方服务器在国外,安装python软件包时下载速度巨慢,因此需要配置国内安装源,在这里使用清华大学的第三方源。首先找到配置文件【.condarc】,其在C盘用户目录下,如图:如果不存在,则直接创建即可。打开文件后,将以下内容拷贝到文件中channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud清除索引缓存在命令行执行命令conda clean -i建立虚拟环境测试下载速度conda create -n myenv numpy测试时会发现下载包的速度杠杠的,测试完毕后,删除myenv虚拟环境conda remove -n myenv --all恢复官方安装源如果使用第三方源出现问题,可以恢复官方安装源重试,恢复指令如下:conda config --remove-key channels3. 配置pip国内安装源使用pip安装软件包时,有些安装包下载速度特别慢,可以选择国内的安装源。3.1 安装源列表以下安装源可以选择:# 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ # 阿里云 http://mirrors.aliyun.com/pypi/simple/ # 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple3.2 安装源的使用方式临时使用以安装tensorflow使用阿里云安装源为例,在-i后面指定安装源即可pip install tensorflow_gpu==2.3 -i http://mirrors.aliyun.com/pypi/simple/永久使用做如下配置后,无需再使用-i选项pip install pip -U #升级 pip 到最新的版本后进行配置: pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/恢复官方安装源如果安装源出现异常,恢复官方安装源的方式如下:pip config unset global.index-url`3. 安装VsCode3.1 VsCode安装下载地址:https://code.visualstudio.com/安装过程略3.2 VsCode中文支持启动VsCode后,点击左侧的扩展功能栏,输入chinese,选择【简体中文】语言包安装重启即可转换为中文。3.3 VsCode设置之文件修改自动保存开启了这个配置后,对文件的修改为自动保存,再也不会因为没有保存导致心血浪费了。3.4 VsCode设置之自动补全输入editor.tabCompletion开启自动补全3.5 python插件的安装点击VsCode左侧扩展工具栏,输入Python,选择第一个结果,然后在右侧点击安装即可。3.6 jupter插件的安装4. 验证安装环境测试python版本启动命令提示符,输入python查看python版本,从下图中可知python版本为3.7.0测试Vscode中运行jupter notebook在目录下创建demo.ipynb文件,ipynb后缀为jupter notebook文件的后缀,在右侧的代码输入框内输入 import numpy as np print(np.__version__)查询numpy的版本,如果正确输出版本号,则说明环境搭建成功,从下图可知,numpy的版本号为1.21.25. jupyter中常用的快捷键有哪些?Ctrl + Enter :运行代码Shift + Enter:运行代码,光标定位到下一行Tab : 代码补全Shift + Tab / ? / ?? :查看文档Esc:命令模式Enter:编辑模式命令模式下:A:上面添加一个单元格B:下面添加一个单元格DD:删除一个单元格M:MarkdownY:代码推荐阅读:物体检测快速入门系列(2)-Windows部署GPU深度学习开发环境物体检测快速入门系列(3)-Windows部署Docker GPU深度学习开发环境物体检测快速入门系列(4)-TensorFlow 2.x Object Detection API快速安装手册物体检测快速入门系列(1)-基于Tensorflow2.x Object Detection API构建自定义物体检测器
-
【功能模块】深度学习模型部署【操作步骤&问题现象】1、深度学习模型(如检测、跟踪)部署时,是选用c++还是培养python?mdc300 mini上能否pip安装?python是否支持和c++程序之间的通信?2、modelzoo给的模型大部分是基于python的,是否能支持转换为om模型?算子是否支持?
-
【功能模块】OBS Python SDK上传文件【操作步骤&问题现象】from obs import PutObjectHeaderfrom obs import ObsClient# 创建ObsClient实例ak = 'XXXXXX'sk = 'XXXXXX'server = 'https://obs.cn-south-1.myhuaweicloud.com'obsClient = ObsClient(access_key_id=ak,secret_access_key=sk,server=server)# 使用访问OBSresp = ObsClient.putFile(bucketName='XXXXXX',objectKey='test.txt',file_path='/Users/test.txt')if resp.status < 300: print('requestId:', resp.requestId) print('etag:', resp.body.etag) print('versionId:', resp.body.versionId) print('storageClass:', resp.body.storageClass)else: print('errorCode:', resp.errorCode) print('errorMessage:', resp.errorMessage)
-
创建云函数首先创建一个云函数,这里选择事件函数python3.6版本。函数创建成功后如下图所示:默认的代码:功能解释:将从函数入口传递的event变量值转为字符串并返回构造的字典 # -*- coding:utf-8 -*- import json def handler (event, context): return { "statusCode": 200, # 函数返回状态值 "isBase64Encoded": False, # 内容是否为base64编码 "body": json.dumps(event), # 函数返回主体,这里为解码后的event "headers": { # 请求的返回头字段 "Content-Type": "application/json" # 内容类型为 json类型 } }创建APIG触发器点击创建啊触发器,并选择安全认证方式为“None”,再点击确定。创建成功后即可看到调用的URL。使用工具对URL进行请求,即可得到触发函数的返回结果。
-
【功能模块】调用pythoon外部脚本【操作步骤&问题现象】1、调用外部python脚本文件,脚本文件在编译器上是可以正常运行的2、使用weautomate工具运行报错,报错信息为:ModuleNotFoundError(\"No module named 'xlwt'\")]但是我去weautomate对应的文件夹里面有xlwt包(如图)【截图信息】【日志信息】调用python脚本中的函数 [调用python脚本中的函数] [NOK] [RobotUncaughtError] [系统执行错误: 发生了未捕获异常,详情:ModuleNotFoundError(\"No module named 'xlwt'\")]
-
Python 是一种简单易学并且结合了解释性、编译性、互动性和面向对象的脚本语言。Python提供了高级数据结构,它的语法和动态类型以及解释性使它成为广大开发者的首选编程语言。 Python 是解释型语言: 开发过程中没有了编译这个环节。类似于PHP和Perl语言。 Python 是交互式语言: 可以在一个 Python 提示符 >>> 后直接执行代码。 Python 是面向对象语言: Python支持面向对象的风格或代码封装在对象的编程技术。Python的创始人为Guido van Rossum。1989年,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承。Python 是由其他语言发展而来的,其中主要包括 ABC、Modula-3、C、C++、SmallTalk、Unix shell 等。自从2004年以后,python的使用率呈线性增长。Python 2于2000年10月16日发布,稳定版本是Python 2.7。Python 3于2008年12月3日发布,不完全兼容Python 2。2011年1月,它被TIOBE编程语言排行榜评为2010年度语言。python发布的版本过程主要包括如下:发布版本年份GPL 兼容0.9.0 至 1.21991-1995是1.3 至 1.5.21995-1999是1.62000否2.02000否1.6.12001否2.12001否2.0.12001是2.1.12001是2.1.22002是2.1.32002是2.2 及更高2001至今是.........3.10.4March 24, 2022是
-
ModelArts 是面向开发者的一站式 AI 平台,为机器学习与深度学习提供海量数据预处理及交互式智能标注、大规模分布式训练、自动化模型生成,及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期 AI 工作流。这个案例还是可玩一下的用Python代码,将健身操mp4视频转化为用字符串表示的形式进行放映,定制属于你的“本草纲目女孩”https://developer.huaweicloud.com/develop/aigallery/notebook/detail?id=c81526e5-cc88-497f-8a21-41a5632e014e每段视频是由一帧帧图像构成,Opencv处理视频图像信息的原理就是将视频转为一帧帧的图像,将图像帧根据需求进行处理后,再将图像帧处理转换为视频,即可达到处理视频的目的。本案例的实现原理也是基于上述,我们将需要处理的视频准备好了后,利用Python的一系列库函数如Opencv,将视频转换为一批帧图像,再通过代码函数对帧图像的像素进行处理,将其转换为字符串,最后将所有处理好的帧图像转换为视频进行播放,即可达到视频处理的目的。本案例的实现过程主要分为以下几步1.导入数据2.导入库函数;3.将视频转化为图像帧;4.对图片帧进行ASCII码的转换;5.将转换好的图片帧合成视频
-
今天起大早给大家写完了最新的活动以后发现闲来无事 对python情有独钟的我怎么可能会孤独呢 大家都知道python是一门超级简单的语言无论是从语法结构还是操作上都是和其他语言有很大的明显区别 更何况当今世界如何去实现人工智能 python有些是java无法替代的,喜欢java语言的兄弟们别喷我啊 哈哈 各有千秋 所以今天我们的实验主题就是如何实现一个简单的 智能聊天机器人 无论是手机 电脑 音箱 手表 耳机 都已经采用了语言唤醒的功能 智能生活离我们也是越来越近 今天就让我们动手简单的操作一下吧,用爬虫来实现小艾的爬取 首先我们在爬取之前要导入一个request的包这个是必然的 我们用while死循环来实现无限的和奇迹人对话功能x输入你要说的话,再用xurllib.parse.quote(x) 编码来URL 中使用其他字符就需要进行 URL 编码,urlopen( ) 方法用于打开一个远程的url连接,并且向这个连接发出请求,获取响应结果。返回的结果是一个http响应对象,这个响应对象中记录了本次http访问的响应头和响应体urllib.request.urlopen 参数介绍:urllib.request.urlopen( url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)html_doc 等于link里的内容,并指定为utf8编码的文档(utf8是一种可变长度字符编码,可以在一个网页上显示多种语言)最后一个简单的输出就可以啦!是不很简单呢?对的很简单 这里面我们要注意的是编码格式问题 毕竟转换以后不一定会是啥 统一是最好的了 对吧 这里我们用爬取的步骤来收个尾!第一步:获取网页链接第二步:数据存储第三步:预处理(数据清洗)第四步:数据利用牢记爬虫的四部曲源码: import urllib.requestimport rewhile True: x = input("主人:") x = urllib.parse.quote(x) link = urllib.request.urlopen( "http://nlp.xiaoi.com/robot/webrobot?&callback=__webrobot_processMsg&data=%7B%22sessionId%22%3A%22ff725c236e5245a3ac825b2dd88a7501%22%2C%22robotId%22%3A%22webbot%22%2C%22userId%22%3A%227cd29df3450745fbbdcf1a462e6c58e6%22%2C%22body%22%3A%7B%22content%22%3A%22" + x + "%22%7D%2C%22type%22%3A%22txt%22%7D") html_doc = link.read().decode() reply_list = re.findall(r'\"content\":\"(.+?)\\r\\n\"', html_doc) print("小i:" + reply_list[-1])
-
1.元组1.1 元组定义:Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。元组和字符串都是不可变序列.1.1.1 语法定义元组语法 ( ) 和 ,In [1]: a= 1,2,3In [2]: aOut[2]: (1,2,3)In [3]: type(a)Out[3]:tupleIn [4]: b=(1,2,3)In [5]: bOut[6]: (1, 2, 3)In [7]: type(b)Out[7]:tupleIn [8]: a= ()In [9]: type(a)Out[10]: aIn [11]: ( )Out[11]:tupleIn [12]: a= (2)In [13]: aOut[13]: 2In [14]: type(a)Out[14]:intIn [15]: a= (2,)In [16]: aOut[16]: (2,)In [17]: type(a)Out[17]:tupleIn [18]: a= 2In [19]: aOut[19]: 2In [20]: a=2,Out[20]: (2,)可存放的数据类型:数字(整型)、字符串、元组嵌套类型、元组嵌套列表、元组嵌套字典1.1.2 访问元组和列表一样In [21]: a= (11,22,33,11,22,11,11)In [22]: a[2]Out[22]: 33In [23]: b.count(11)Out[23]:4In [24]: b.index(33)Out[24]: 21.1.3 修改元组Python 中不允许修改元组的数据,包括不能删除其中的元素。元组是不可变的,也就是说,元组中的元素在被赋值后不能改变。但是,如果元素本身是一个可变数据类型的列表,那么其嵌套项可以被改变In [25]: name= [‘小鹏’,’凉凉’,’卷妹’,’吕布’,’貂蝉’,’黑客’,’魏延’]In [26]: atuple=tuple(names)In [27]:atupleOut[27]: (‘小鹏’,’凉凉’,’卷妹’,’吕布’,’貂蝉’,’黑客’,’魏延’)In [28]: alist=list(atuple)In [29]: alistOut[29]: [‘小鹏’,’凉凉’,’卷妹’,’吕布’,’貂蝉’,’黑客’,’魏延’]1.2 tuple函数tuple函数的功能与list函数基本上一样的,以一个序列作为参数并把它转换为元组,如果参数是元组,那么该参数就会被原样返回。 多维列表/元祖访问 a[ ][ ]In [30]: chool_names = (('北京大学', '清华大学'),('南开大学', 'CSDN大学'),('贵州大学', '青海大学'))In [31]: chool_names[1][1]Out[32]: ‘CSDN大学’1.3 元组的优点与列表相比,元组的优点: 通常将元组用于不同的数据类型,将列表用于相同(或相似)的数据类型。由于元组不可变,所以遍历元组比列表要快(较小的性能提升)。 元组可以用作字典的Key,而列表不行。因为字典的Key 必须是不可变的,元组本身就是不可变的。 如果数据不需要更改,将其作为元组来实现,可以确保“写保护”2.字典2.1 字典定义 :键值对(key:value)变量student为字典类型:student= {'name':' 小鹏', 'id':100, 'sex':' 男', 'address':' 中国’}2.2 字典访问In [2]: student['name']Out[2]: '小鹏'In [3]: student['adress']----------------------------------------------------------------------KeyError Traceback (most recent call last)<ipython-input-3-c1a4f755140b> in <module>----> 1 student['adress']KeyError: 'adress' 访问不存在的键则会报错,解决方法:get()使用 get(‘key’) 不存在不会报错,而且可以设置默认值In [4]: student.get("address")在我们不确定字典中是否存在某个键而又想获取其值时,可以使用get方法,还可以设置默认值.In [5]: student.get("id")Out[5]: 100In [6]: student.get("id",19)Out[6]: 192.3 字典和列表的区别字典是用键值对的方式存储多个数据,获取元素用key的方式获取,值无特殊顺序列表是通过下标获取,有顺序2.4 字典的增删改查2.4.1 添加、修改元素字典的每个元素中的数据是可以修改的,只要通过key找到,即可修改student = {"name":"小鹏","id":100,"sex":"男"}print("修改前的内容:",student)student["id"] = 30print("修改之后:",student)修改前的内容: {'name': '小鹏', 'id': 100, 'sex': '男'}修改之后: {'name': '小鹏', 'id': 30, 'sex': '男'}如果在使用 变量名['键'] = 数据 时,这个“键(key)”在字典中不存在,那么就会新增这个元素student = {"name":"小鹏","id":100,"sex":"男"}print("增加前的内容:",student)student["local"] = "北京"print("增加之后:",student)增加前的内容: {'name': '小鹏', 'id': 100, 'sex': '男'}增加之后: {'name': '小鹏', 'id': 100, 'sex': '男', 'local': '北京'}2.4.2 删除元素 对字典进行删除操作,有一下几种1. del删除指定的元素student = {"name":"小鹏","id":100,"sex":"男"}del student["id"]print(student)2.del删除整个字典del studentprint(student)3.clear清空整个字典student.clear()print(student)4.pop删除字典指定元素并且得到值result = student.pop("name")print(student)print(result)5.popitem随机返回并删除字典中的一对键和值(项)(字典没有顺序所以是随机,实际是从后往前删)a,b = student.popitem()print(student)print(a,b)2.4.3 查找 元素info = {"name":"小鹏","id":100,"sex":"男","age":30}1.普通获取数据方式简写print(info["name"])print(info.get("name","无名"))完整name = info["name"]print(" 使用[key]=",name)name = info.get("name")print(" 使用get(key) 查找=",name)2.通过Key查找数据 #info和info.keys效果是一样的(只不过info隐藏了)if "name" in info: print("使用in根据key从字典中查找name是存在的。")if "name" in info.keys(): print("使用in根据key从字典中的info.keys()查找name是存在的")3.通过Value获取值if "小鹏" in info.values(): print("使用in根据'值'从字典中查找info.values()小鹏是存在的。")2.4.4 字典的键值操作len () 测量字典中,键值对的个数In [1]: info = {"name":"小鹏","id":100,"sex":"男","age":30}In [2]: len(info)Out[2]: 4keys 返回一个包含字典所有 KEY 的列表In [3]: info.keys()Out[3]: dict_keys(['name', 'id', 'sex', 'age'])values 返回一个包含字典所有 value 的列表In [4]: info.values()Out[4]: dict_values(['小鹏', 100, '男', 30])items 返回可遍历的( ( 键 , 值 ) 元组数组In [5]: info.items()Out[5]: dict_items([('name', '小鹏'), ('id', 100), ('sex', '男'), ('age', 30)])has_key Python3中废弃了,这个方法是python 2.6以后支持的,但在python 3.0版本开始将使用in. dict.has_key(key)如果key在字典中,返回True,否则返回False2.4.5 字典 遍历通过for ... in ...:的语法结构,我们可以遍历字符串、列表、元组、字典等数据结构。字符串遍历列表遍历元组遍历a_str = "hello atguigu"for a in a_str:print(a)a_list = [" 刘备", 2, [" 曹操"," 曹丕"], "孙权", 5]for a in a_list:print(a,end=" ")print("")a_tuple = (" 曹操", " 刘备", 3, 4, 5)for a in a_tuple:print(a,end=" ")print("")遍历字典的key(键)name = {"name":"小鹏","id":100,"sex":"男","age":30}for key in name.keys(): print(key)遍历字典的value(值)for value in name.values(): print(value)遍历字典的items项(元素)for ite in name.items(): print(ite)遍历字典的key-value(键值对)for key,value in name.items(): print(key,value)2.4.6 遍历列表引入如果对一个列表,既要遍历索引又要遍历元素时,首先可以这样写:names = [" 小鹏"," 几何心凉"," 貂蝉"]for i in range(len(names)):print("%d %s "% (i,names[i]))上述方法有些累赘,利用枚举遍历 enumerate() 会更加直接和优美:names = [" 小鹏"," 几何心凉"," 貂蝉"]for index,value in enumerate(names):print("%d %s " % (index,value))enumerate还可以接收第二个参数,用于指定索引起始值,如:names = [" 小鹏"," 几何心凉"," 貂蝉"]for index,value in enumerate(names,2): #2从第几个开始print("%d %s " % (index,value))enumerate() 遍历字典:infos = {'name':' 小鹏', 'id':100, 'sex':' 男生', 'address':' 中国北京'}for index,value in enumerate(infos):print("%d %s " % (index,value))enumerate() 遍历值:infos = {'name':' 小鹏', 'id':100, 'sex':' 男生', 'address':' 中国北京'}for index,value in enumerate(infos.values()):print("%d %s " % (index,value))原文链接:https://blog.csdn.net/qq_62294245/article/details/124542906
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签