window上小而美的软件推荐度按排名

Notepad++ 更好用更强大的笔记本QTranslate 本地翻译神器7-zip 解压缩软件Wox 程序/文件/快捷 神器 1!Everthing 搜索本地文件神器Clover 像浏览器一样打开文件夹Ditto 记录每次复制内容,黏贴时可选择,复制黏贴神器Listary 程序/文件/快捷 神器 2!火萤酱 程序/文件/快捷 神器 3!Q-Dir 多窗口资源管理器SPlayer 干净的射手播放器TrafficMonitor CPU 网络监控控件ScreenToGif.exe gif录屏软件gifcam.exe gif录屏软件geek.exe 更好用的卸载软件360极速浏览器 本的化的ChromeCmder window上更好用的shellcurl 配合cmder使用,代替postman设置全局快捷后,效率起飞!

April 27, 2019 · 1 min · jiezi

Python 进阶之路 (八) 最用心的推导式详解 (附简单实战及源码)

什么是推导式大家好,今天为大家带来问我最喜欢的Python推导式使用指南,让我们先来看看定义推导式(comprehensions)是Python的一种独有特性,推导式是可以从一个数据序列构建另一个新的数据序列的结构体。一般有三种使用最多的推导式:列表推导式(list comprehensions)字典推导式(dict comprehensions)集合推导式(set comprehensions)使用推导式可以简化代码的同时提高效率,在我的个人使用场景中,用的最多的还是列表推导式,接下来我会一一介绍这三种常见的推导式,最后通过一个简单实战发现推导式的高效之处列表推导式(list comprehensions)模板首先,让我们看看使用列表推导式的基础模板:[ expression for item in list if conditional ]简单来说,遍历一个list,得到每一个元素item,我们相对item进行哪些操作,写在expression里就可以,如果对筛选有什么条件,可以放在if后面下面可以通过大量实例帮助大家理解使用实例先看第一个小栗子,在这里我们用for循环常规遍历一个字符串‘human’,把每一字母作为元素放在一个叫h_letters的数组里面:h_letters = []for letter in ‘human’: h_letters.append(letter)print(h_letters)Out:[‘h’, ‘u’, ’m’, ‘a’, ’n’]如果我们根据列表推导式的定义模板,可以简化如下:h_letters = [ letter for letter in ‘human’ ]print( h_letters)Out: [‘h’, ‘u’, ’m’, ‘a’, ’n’]这样的话便捷了很多,看上去也很容易理解,这里我们在expression部分什么都没有些,只是提出了每个元素而已,运行时的python执行方式如下:我们可以在expression的部分进行很多操作,比如:h_letters = [ letter.upper() for letter in ‘human’ ]print( h_letters)Out: [‘H’, ‘U’, ‘M’, ‘A’, ‘N’]这样我们可以很容易的实现字母的大小写转化同样的,我们可以在if后面写出筛选条件,比如这里,我们想要提出从-20 ~ 20中所有能被3整除的正数:result = [num for num in range(-20,20) if num %3==0 and num > 0] print(result) #多个条件可以用and连接Out: [3, 6, 9, 12, 15, 18]列表推导式的实际应用场景十分广泛,它于lambda不同,是真正好理解,提成效率的python特性之一,这里相信聪明的你已经想到了更多用法!字典推导式(dict comprehensions)模板让我们看先来看使用字典推导式的基础模板:{ key:value for key,value in existing_data_structure } 这里和list有所不同,因位dict里面有两个关键的属性,key和value,大同小异,我们现在的expression部分可以同时对key和value进行操作下面来看最常见的应用使用实例首先最实用的功能莫过于可以实现一个dict的key,value值互换:person = {’name’:‘xiaobai’,‘city’:‘paris’}person_reverse = {v:k for k,v in person.items()} #简单互换key和value的值即可print(person_reverse)Out: {‘xiaobai’: ’name’, ‘paris’: ‘city’}这里就非常方便了用字典推导式,不然的话只能用for循环,会稍微麻烦一些。让我们再看下一个很巧的例子:nums = {‘a’:10,‘b’:20,‘A’:5,‘B’:3,’d’:4}num_frequency = {k.lower():nums.get(k.lower(),0) + nums.get(k.upper(),0) for k in nums.keys() }print(num_frequency)Out: {‘a’: 15, ‘b’: 23, ’d’: 4}这里使用的就比较灵活,我们有一个数据,key是字母的大小写混在一起,我们想统计同一个key(大小写都包括)所对应的数字出现总和,所以在新建的num_frequency 字典用使用了推导式,这里我们遍历的是dict.keys()配合dict.get()方法再比如下面的例子:fruit = [‘apple’,‘banana’,‘organge’,‘mango’,‘peach’]fruit_len = {f:len(f) for f in fruit}print(fruit_len)Out:{‘apple’: 5, ‘banana’: 6, ‘organge’: 7, ‘mango’: 5, ‘peach’: 5}我们有一个fruit的list,现在想要得到每一种水果的单词长度,就可以通过图中所示的方法实现,非常容易最后再来看一个字典推导式配合枚举(enumerate)的例子:fruit = [‘apple’,‘organge’,‘banana’,‘mango’,‘peach’]fruit_positon = {v:i for i,v in enumerate(fruit)}print(fruit_positon)Out: {‘apple’: 0, ‘organge’: 1, ‘banana’: 2, ‘mango’: 3, ‘peach’: 4}还是用刚才的list,这次我们得到的key是fruit的每个元素,value则是该元素在fruit所属的index集合推导式(Set comprehensions)模板让我们看先来看使用集合推导式的基础模板:{ expression for item in Sequence if conditional }其实集合推导式和list的推导式很像,但是既然是结合,肯定会配合利用Set的属性来实现我们的目的,如果你还对Set这种数据结构不够了解,可以参考我之前的文章:Python 进阶之路 (四) 先立Flag, 社区最全的Set用法集锦下面来看最常见的应用使用实例首先,我们来看一个根据Set值唯一的特性的例子,我们有一个list叫names,用来存储名字,其中的数据很不规范,有大写,小写,还有重复的,我们想要去重并把名字的格式统一为首字母大写,实现方法便是用Set推导式:names = [ ‘Bob’, ‘JOHN’, ‘alice’, ‘bob’, ‘ALICE’, ‘James’, ‘Bob’,‘JAMES’,‘jAMeS’ ]names_standard = { n[0].upper()+n[1:].lower() for n in names}print(names_standard)Out: {‘John’, ‘Bob’, ‘James’, ‘Alice’}这里就不再举很多的其他例子了,因为使用的方式多种多样,剩下的就靠广大人民群众的智慧自行开发即可!简单实战现在让我们来看一个比较综合的例子!我们现在手里有一个英文字典的dictionary.txt文件,包含从AZ的单词具体需求:我们想要找到长度大于5的正反拼写都具有实际含义的单词我们现在会通过各种推导式来实现这个目标,我会在文章最后把txt文件及Python文件下载链接附上,这样大家如果先要练习可以自行下载首先,我们的初始目录结构如下:这里我新建了一个test文件夹,把dictionary.txt 文件和python文件放在一起方便读取,开始之前,先大概看下txt文件长什么样子:第一步:读取dictionary.txt中的单词,选出长度大于5的import osprint(os.getcwd())with open(‘dictionary.txt’) as dictionary_file: words = (line.rstrip() for line in dictionary_file) words_over_five_letters = [w for w in words if len(w)>5 ] 这里通过列表推导式words_over_five_letters 用来存储所有长度大于5的单词第二步:将上一步选出的单词全部倒序存贮reversed_words ={ word[::-1] for word in words_over_five_letters }通过set推导式非常容易的实现第三步:通过if条件筛选得出结果reversible_words = [ word for word in words_over_five_letters if word in reversed_words]for word in reversible_words[0:20]: print(word) Out: abrood agenes amaroid amunam animal animes bruted darter decart decurt deedeed deflow degami degener degged deified deifier deliver denier这里最后共有203个结果,我们只看了前20个,验证方法就是只要长度大于5的单词同时存在于reversed_words和words_over_five_letters即可完整代码如下:import osprint(os.getcwd())with open(‘dictionary.txt’) as dictionary_file: words = (line.rstrip() for line in dictionary_file) words_over_five_letters = [w for w in words if len(w)>5 ]reversed_words ={ word[::-1] for word in words_over_five_letters }reversible_words = [ word for word in words_over_five_letters if word in reversed_words]for word in reversible_words[0:20]: print(word)资料下载dictionary.txtdictionary.py总结这次为大家总结了python里面常见的三种推导式相关用法以及最后的小实战环节,希望大家喜欢,双击666点个赞吧!! ...

February 18, 2019 · 2 min · jiezi

Python 进阶之路 (六) 九浅一深 lambda,陈独秀你给我坐下!

lambda是什么大家好,今天给大家带来的是有关于Python里面的lambda表达式详细解析。lambda在Python里面的用处很广,但说实话,我个人认为有关于lambda的讨论不是如何使用的问题,而是该不该用的问题。接下来还是通过大量实例和大家分享我的学习体验,可能最后你也会得出和我一样的结论。好啦,首先让我们先搞明白基础定义,lambda到底是什么?Lambda表达了Python中用于创建匿名函数的特殊语法。我们将lambda语法本身称为lambda表达式,从这里得到的函数称之为lambda函数。其实总结起来,lambda可以理解为一个小的匿名函数,lambda函数可以使用任意数量的参数,但只能有一个表达式。估计有JavaScript ES6经验的朋友们听上去会很亲切,具体函数表达式如下:模板: lambda argument: manipulate(argument)参数:argument就是这个匿名函数传入的参数,冒号后面是我们对这个参数的操作方法让我们参考上面的定义模板和参数, 直接看一个最简单的例子:add_one = lambda x:x+1 # 1个参数,执行操作为+1add_nums = lambda x,y:x+y # 2个参数,执行操作为相加print(add_one(2)) # 调用add_oneprint(add_nums(3,7)) # 调用add_nums>>> 3 10相比大家已经发现lambda匿名函数的特点了,就是对于较为简单的功能,无需自己def一个了,单行就可以写下,传参和执行方法一气呵成lambda用法详解接下来让我们看看lambda的实际应用,就我自己使用lambda的体验来说,从来没有单独用过,lambda一般情况下是和map,filter,reduce这些超棒的内置函数以及dict,list,tuple,set 等数据结构混用,这样才能发挥它的最大效果,如果有朋友还不太熟悉这些内置函数,可以看一下我上一篇文章 Python 进阶之路 (五) map, filter, reduce, zip 一网打尽好了,闲话少说,下面让我们一个个来看lambda + map首先出场的是lambda+map的组合,先看下面这个例子:numbers = [1,2,3,4,5]add_one = list(map(lambda n:n+1,numbers)) #map(fun,sequence)print(list(add_one))print(tuple(add_one))Out: [2, 3, 4, 5, 6] (2, 3, 4, 5, 6)这个是我们上一期的例子,实现一个数组(元组)每个元素+1,让我们回忆一下map的用法map(fun,sequence),fun是传递的方法,sequence是一个可迭代的序列,这里我们的fun就是匿名函数lambda n:n+1,这里非常完美的解释了lambda的设计初衷,因为如果没有lambda,我们的解决方案是这样:def add(num): return num+1numbers = [1,2,3,4,5]add_one = list(map(add,numbers))print(add_one)print(tuple(add_one))显然易见,这里的add方法有点多余,所以用lambda代替是个好的选择。让我们再看下一个例子,这是我自己备份日志时写的一小段代码,命名不是很规范:from datetime import datetime as dtlogs = [‘serverLog’,‘appLog’,‘paymentLog’]format =’_’+ dt.now().strftime(’%d-%m-%y’)+’.py’result =list(map(lambda x:x+format,logs)) # 利用map+lambda 实现字符串拼接print(result)Out:[‘serverLog_11-02-19.py’, ‘appLog_11-02-19.py’, ‘paymentLog_11-02-19.py’]这里和刚才的加1例子差不多,但是换成了字符串的拼接,然而我这里用lambda并不是很好的解决方案,最后我们会说,现在大家应该对map + lambda 有一些感觉了,让我们再来个和dict字典互动的例子:person =[{’name’:‘Lilei’, ‘city’:‘beijing’}, {’name’:‘HanMeiMei’, ‘city’:‘shanghai’}]names=list(map(lambda x:x[’name’],person))print(names)Out:[‘Lilei’, ‘HanMeiMei’]好了,看到这里对于map+lambda的用法大家已经很清楚了应该~lambda + filterlambda和filter的组合也很常见,用于特定筛选条件下,现在让我们来看上篇文章filter的例子,就应该很好理解了:numbers = [0, 1, 2, -3, 5, -8, 13]# 提取奇数result = filter(lambda x: x % 2, numbers)print(“Odd Numbers are :",list(result))# 提取偶数result = filter(lambda x: x % 2 == 0, numbers)print(“Even Numbers are :",list(result))#提取正数result = filter(lambda x: x>0, numbers)print(“Positive Numbers are :",list(result))Out:Odd Numbers are : [1, -3, 5, 13] Even Numbers are : [0, 2, -8] Positive Numbers are : [1, 2, 5, 13]这里无非就是我们把filter(fun,sequence)里面的fun换成了我们的lambda,只是lambda的函数部分(x%2,x%2==0,x>0)都是可以返回True或者False来判断的,符合fiter的要求,用刚才李雷和韩梅梅的例子也是一个道理:person =[{’name’:‘Lilei’, ‘city’:‘beijing’}, {’name’:‘HanMeiMei’, ‘city’:‘shanghai’}]names=list(filter(lambda x:x[’name’]==‘Lilei’,person)) # 提取李雷的信息print(names)Out:[{’name’: ‘Lilei’, ‘city’: ‘beijing’}]lambda + reduce还是让我们看一下上篇文章的例子:from functools import reduce # Only Python 3numbers = [1,2,3,4]result_multiply = reduce((lambda x, y: x * y), numbers)result_add = reduce((lambda x,y: x+y), numbers)print(result_multiply)print(result_add)Out:24 10这个例子用lambda和reduce的配合实现了list求累积和和累积乘法。有意思的是这个例子具有两面性,一方面展示了lambda和reduce如何一起使用,另一方面也引出了接下来我想说的重点:lambda真的值得用吗?到底应该怎么用?避免过度使用lambda通过上面的例子大家已经看到了lambda的实际应用场景,但是这里我想和大家分享一下我的看法:我认为lambda的缺点略多于优点,应该避免过度使用lambda首先,这仅仅是我的个人看法哈,希望大家理解,我的理由如下:首先让我们拿lambda方法和常规def做个对比,我发现lambda和def的主要不同点如下:可以立即传递(无需变量)只需一行代码,简洁(未必高效)可以会自动返回,无需returnlambda函数没有函数名称有关优点大家都可以看到,我主要想说一下它的缺点,首先,从真正需求出发,我们在大多数时候是不需要lambda的,因为总可以找到更好的替代方法,现在我们一起看一下刚才lambda+reduce 的例子,我们用lambada实现的结果如下:from functools import reduce # Only Python 3 numbers = [1,2,3,4] result_multiply = reduce((lambda x, y: x * y), numbers) result_add = reduce((lambda x,y: x+y), numbers)这里用lambda并没有实现简单高效的目的,因为我们有现成的sum和mul方法可以用:from functools import reducefrom operator import mulnumbers = [1,2,3,4]result_add = sum(numbers)result_multiply =reduce(mul,numbers)print(result_add)print(result_multiply)Out: 10 24结果是一样的,但是显然用sum和mul的方案更加高效。再举个常见的例子说明,假如我们有一个list存储了各种颜色,现在要求把每个颜色首字母大写,如果用lambda写出是这样:colors = [‘red’,‘purple’,‘green’,‘blue’]result = map(lambda c:c.capitalize(),colors)print(list(result))Out:[‘Red’, ‘Purple’, ‘Green’, ‘Blue’]看着似乎不错,挺简洁的,但是我们有更好的方法:colors = [‘red’,‘purple’,‘green’,‘blue’]result = [c.capitalize() for c in colors]print(result)Out:[‘Red’, ‘Purple’, ‘Green’, ‘Blue’]用sorted还能处理首字母不规范的情况,连排序都省了:colors = [‘Red’,‘purple’,‘Green’,‘blue’]print(sorted(colors,key=str.capitalize))Out:[‘blue’, ‘Green’, ‘purple’, ‘Red’]还有一个主要原因就是: lambda函数没有函数名称。所以在代码交接,项目移植的场景中会给团队带来很多困难,多写个函数add_one()没什么坏处,因为大家都很容易理解,知道它是执行+1的功能适合lambda的场景话又说回来,存在即合理,那么真正需要我们使用lambda的是哪些场景呢:你需要的方法是很简单的(+1,字符串拼接等),该函数不值得一个名字使用lambda表达式,会比我们能想到的函数名称更容易理解除了lambda,没有任何python提供的函数可以实现目的团队中所有成员都掌握lambda,这样不会造成歧义或浪费时间还有一种场景非常适用,就是在给其他人制造自己很专业的错觉时,比如:哎呀,小老弟,听说你学了Python,知道lambda不? 没听过?不行啊,白学了!来来来,让我给你讲讲。。。此处省略1万字总结今天为大家九浅一深地讲解了lambda的用法和使用场景,所谓九浅一深,就是90%情况下用于创建简单的匿名函数,10%的情况稍微复杂(我这个借口找的太好了)总而言之就是,任何事情都具有两面性,我们在使用lambda之前应该先停下来,问问自己是不是真的需要它。当然,如果需要和别人忽悠的时候都是正反一张嘴,lambda是好是坏全凭一张嘴了,吹牛时请遵守如下原则,屡试不爽:如果你说一个女大学生晚上卖淫就是可耻,但如果改成一个妓女利用业余时间努力学习就励志多了!lambda也是如此 ...

February 12, 2019 · 2 min · jiezi

Python 进价之路 (五) map, filter, reduce, zip 一网打尽

简洁的内置函数大家好,我又回来了,今天我想和大家分享的是Python非常重要的几个内置函数:map,filter,reduce, zip。它们都是处理序列的便捷函数。这很大程度上归功于函数式编程的世界。我们可以利用它们把一些小函数应用于一个序列的所有元素。从而节省编写显式循环的时间。另外,这些中的每一个都是纯函数,有返回值。因此我们可以容易地将函数的返回结果用表达式来表示。好了,又到了大白话时间,为什么用它们,就是可以简化我们的代码,更简洁高效的执行一些需要用到循环迭代为主的任务,接下来让我们一个个来看map()函数构造map()函数的主要作用是可以把一个方法依次执行在一个可迭代的序列上,比如List等,具体的信息如下:基础语法:map(fun, iterable)参数:fun是map传递给定可迭代序列的每个元素的函数。iterable是一个可以迭代的序列,序列中的每一个元素都可以执行fun返回值:map object好了,大白话就是利用map我们可以把一个函数fun 执行到序列iter的每一个元素上,用例子非常好理解基础用法:下面先让我们看一个小例子,假设现在我们有一个List,包含15五个数字,我们想要让每一个数+1,如果不知道map这个函数之前,我们的解决方案是这样的:numbers = [1, 2, 3, 4, 5]for i in range(0,len(numbers)): #对每个元素加1 numbers[i]+=1 print(numbers)Out:[2, 3, 4, 5, 6]或者是这样的:numbers = [1, 2, 3, 4, 5]result = []for n in numbers: result.append(n+1)print(result)Out:[2, 3, 4, 5, 6]但是显然,无论怎么做都会涉及到写循环,这里就是map函数的用武之地了,我们可以用map函数这样实现:def add_one(n): return n + 1numbers = [1, 2, 3, 4, 5]result = map(add_one, numbers)print(result)print(type(result))print(list(result))Out:<map object at 0x00000260F508BE80> <class ‘map’> [2, 3, 4, 5, 6]这里想必聪明的你发现了map的好处,在优化精简代码的同时,某种程度上讲实现了方法和循环部分的分离,这里我们可以发现map返回就是map类,我们这里传递的序列是List,最后输出时经过类型转换也是list在传递序列时只要这个序列是可迭代的就好,不一定非要List,比如我们换一种:def add_one(n): return n + 1 numbers = (1, 2, 3, 4, 5) #序列为元组result = map(add_one, numbers)print(tuple(result)) #Out:(2, 3, 4, 5, 6)输入的序列为同样可以迭代的元组,输出时我们也选择元组,效果一样的。更进一步还用刚才的例子,为了更加简洁,我们可以用lambda函数配合map使用,具体实现如下:numbers = (1, 2, 3, 4, 5) # 迭代对象为tupleresult = map(lambda x: x + 1, numbers)print(list(result)) # 输出对象为list Out:[2, 3, 4, 5, 6]更加简洁优雅了对吧!!这个lambad函数我之后会说,今天它不是主角哈哈,先一带而过。让我们重新把目光转移到map上来,除了刚才的用法,还要一种情况也十分常见,让我们看下面的例子:# List of stringswords = [‘paris’, ‘xiaobai’,’love’]# 把数组中每个元素变为Listtest = list(map(list, words))print(test)Out: [[‘p’, ‘a’, ‘r’, ‘i’, ’s’], [‘x’, ‘i’, ‘a’, ‘o’, ‘b’, ‘a’, ‘i’], [’l’, ‘o’, ‘v’, ’e’]]words是一个只包含字符串类型元素的list,我们用map可以实现将words的每一个元素全部转化为list类型,这里有一点一定要注意,能实现的前提一定是每个元素都是可以迭代的类型,如果出现了如int类型的元素,就会出错啦:# List of stringswords = [18,‘paris’, ‘xiaobai’,’love’]# 把数组中每个元素变为Listtest = list(map(list, words))print(test)Out:TypeError: ‘int’ object is not iterable大家一看错误类型相比立刻就明白啦,所以正确的使用方法一定是类似这种:nums = [3,“23”,-2]print(list(map(float,nums)))Out: [3.0, 23.0, -2.0]总之就是类型要注意,今天我就抛砖引玉简单介绍一下map,具体的用法大家可以自行开发哈,我也在不断学习中filter()函数构造filter()方法借助于一个函数来过滤给定的序列,该函数测试序列中的每个元素是否为真。基础语法:filter(fun, iterable)参数:fun测试iterable序列中的每个元素执行结果是否为True,iterable为被过滤的可迭代序列返回值:可迭代的序列,包含元素对于fun的执行结果都为True简而言之就是filter可以帮助我们根据给出的条件过滤一组数据并返回结果基础用法:让我们先看一个例子:# 过滤元音的方法def fun(variable): letters = [‘a’, ’e’, ‘i’, ‘o’, ‘u’] if (variable in letters): return True else: return False# 给定序列sequence = [‘I’, ’l’, ‘o’, ‘v’, ’e’, ‘p’, ‘y’,’t’,‘h’,‘o’,’n’]# 根据条件得出结果filtered = list(filter(fun, sequence))print(filtered)Out:[‘o’, ’e’, ‘o’]这里我们创建一个可以提取元音字母的方法fun,给定的可迭代序列为list,之后就可以用filter方法很容易的提取出结果啦,再看一个类似例子:# 判断为正数def positive(num): if num>0: return True else: return False#判断偶数def even(num): if num % 2==0: return True else: return Falsenumbers=[1,-3,5,-20,0,9,12]positive_nums = list(filter(positive, numbers))print(positive_nums) # 输出正数 listeven_nums = tuple(filter(even,numbers))print(even_nums) #输出偶数 tupleOut:[1, 5, 9, 12] (-20, 0, 12)看到这里相比大家已经知道filter的基础用法啦, 要先有一个,能返回True或者False的方法,或者表达式作为过滤条件就行啦更进一步这里其实和map一样了,基本上最简洁的用法都是和lambda混在一起,比如下面我们想要把刚才的一大串代码压缩一下:numbers = [0, 1, 2, -3, 5, -8, 13]# 提取奇数result = filter(lambda x: x % 2, numbers)print(“Odd Numbers are :",list(result))# 提取偶数result = filter(lambda x: x % 2 == 0, numbers)print(“Even Numbers are :",list(result))#提取正数result = filter(lambda x: x>0, numbers)print(“Positive Numbers are :",list(result))Out:Odd Numbers are : [1, -3, 5, 13] Even Numbers are : [0, 2, -8] Positive Numbers are : [1, 2, 5, 13]” 爽啊!爽死了!” 郭德纲看到后这么评价,lambda我平时用的不多,但是写到这里,我也觉得要好好学习它了,毕竟和其他编程语言相比,可能这中用法才是python提倡的理念之一:高效简洁,reduce()函数构造Reduce是一个非常有用的函数,用于在列表上执行某些计算并返回结果。它将滚动计算应用于列表中的连续值。例如,如果要计算整数列表的累积乘,或者求和等等基础语法:reduce(function, iterable)参数:fun是连续作用于iterable每一个元素的方法,新的参数为上一次执行的结果,iterable为被过滤的可迭代序列返回值:最终的function返回结果在Python 2中,reduce()是一个内置函数。但是,在Python 3中,它被移动到functools模块。因此,要使用前我们需要导入,这里我的环境是Python 3.6基础用法:先看一个求累加和的小栗子:from functools import reduce # Python 3def do_sum(x1, x2): return x1 + x2 print(reduce(do_sum, [1, 2, 3, 4]))Out:10再看一个累积乘法的例子:from functools import reduce # Python 3def multiply(x, y): return x*ynumbers = [1,2,3,4]print(reduce(multiply, numbers))Out:24更进一步:还是和lambda混搭,更加简洁:from functools import reduce # Python 3numbers = [1,2,3,4]result_multiply = reduce((lambda x, y: x * y), numbers)result_add = reduce((lambda x,y: x+y), numbers)print(result_multiply)print(result_add)Out:24 10zip()函数构造zip()的目的是映射多个容器的相似索引,以便它们可以仅作为单个实体使用。基础语法:zip(*iterators)参数:iterators为可迭代的对象,例如list,string返回值:返回单个迭代器对象,具有来自所有容器的映射值基础用法:其实之前我们在讲dict的创建方法时提到过它,这里从新回顾一下:keys = [’name’,‘age’]values = [‘xiaobai’,18]my_dict = dict(zip(keys,values))print(my_dict)Out:{’name’: ‘xiaobai’, ‘age’: 18}zip可以支持多个对象,比如下面的例子name = [ “xiaobai”, “john”, “mike”, “alpha” ]age = [ 4, 1, 3, 2 ]marks = [ 40, 50, 60, 70 ]# using zip() to map valuesmapped = list(zip(name, age, marks))print (“The zipped result is : “mapped)Out:The zipped result is : [(‘xiaobai’, 4, 40), (‘john’, 1, 50), (‘mike’, 3, 60), (‘alpha’, 2, 70)]这里我们可以很容易的的把name,age,marks这三个list里面相同index的值映射打包在一起更进一步:通过上面的例子,我们发现可以很容易的以类似1对1的形式把不同对象的同一索引位置的值打包起来,那如果是解包呢?也是类似的,就是多了一个 * 而已names, ages, marks = zip(*mapped)print (“The name list is : “,names)print (“The age list is : “,ages)print (“The marks list is : “,marks)Out: The name list is : (‘xiaobai’, ‘john’, ‘mike’, ‘alpha’) The age list is : (4, 1, 3, 2) The marks list is : (40, 50, 60, 70)总结今天主要为大家介绍了map,filter,reduce,zip四个高效的python内置函数的用法,我也是刚刚接触,了解不够深入,如果介绍的有错误或者歧义还请大家多多谅解和包容,如果有大神可以进一步补充说明一定要写个评论呀,让我们一起进步。最后为大家讲个悲伤的故事: ...

February 11, 2019 · 3 min · jiezi

Python 进价之路 (二) Dict 进价宝典,初二快乐!

新年快乐大家好,今天是大年初二,身在国外没有过年的氛围,只能踏实写写文章,对社区做点贡献,在此祝大家新年快乐!上一期为大家梳理了一些List的进阶用法,今天我们来看字典Dict的相关技巧,我个人在编程中对字典的使用非常频繁,其实对于不是非常大的数据存储需求,字典是一个不错的选择,比List要快的多,我在基础篇里面讲过了一些关于dict的基础方法,如果没有看过的朋友们可以点击链接Python 基础起步 (八) 字典实用技巧大全 ,好啦,闲话少说,现在让我们一起来看看今天的进阶技巧吧~字典进阶方法汇总创建字典这里介绍最常见的几种方式,直接上例子:first = {} # 创建空字典second = dict() # 创建空字典keys = [‘Name’,‘Age’,‘Job’,‘Salary’]values = [‘White’,50,‘cook’,10000]third=dict(zip(keys,values)) # Zip创建fouth = dict(Name=‘White’,Age=50,Job=‘cook’,Salary=10000) # 等号创建fifth = {1: {’name’: ‘John’, ‘age’: ‘27’, ‘sex’: ‘Male’}, 2: {’name’: ‘Marie’, ‘age’: ‘22’, ‘sex’: ‘Female’}} # 创建一个嵌套字典print(first)print(second)print(third)print(fouth)print(fifth[1])Out: {} {} {‘Name’: ‘White’, ‘Age’: 50, ‘Job’: ‘cook’, ‘Salary’: 10000} {‘Name’: ‘White’, ‘Age’: 50, ‘Job’: ‘cook’, ‘Salary’: 10000} {’name’: ‘John’, ‘age’: ‘27’, ‘sex’: ‘Male’}这里我们可以直接用{}或者dict()创建空的字典,或者直接为字典以key:value的形式赋值,Zip和等号直接赋值也很方便,如果需要多层nested也可以很简单的实现,有关创建就说这么多啦字典排序有关字典排序,我们有两种选择,第一是根据字典的key值排序,第二是根据Value值排序,让我们一个个来看,首先让我们新建一个字典用于测试:final_result= dict(Math=80,Chinese=78,English=96,Science=60,Art=75)print(final_result.items())Out: dict_items([(‘Math’, 80), (‘Chinese’, 78), (‘English’, 96), (‘Science’, 60), (‘Art’, 75)])根据Key值排序这里我们创建一个字典final_result,key值是科目的名字,value值是分数,首先根据Key值进行排序,首先让我们根据Key值升序,可选的方法很多,比如sorted, operator, lamba :print(sorted(final_result.items())) # 根据key的值升序Out:[(‘Art’, 75), (‘Chinese’, 78), (‘English’, 96), (‘Math’, 80), (‘Science’, 60)]import operatorprint(sorted(final_result.items(),key=operator.itemgetter(0)))Out:[(‘Art’, 75), (‘Chinese’, 78), (‘English’, 96), (‘Math’, 80), (‘Science’, 60)]print(sorted(final_result.items(),key=lambda x:x[0]))Out:[(‘Art’, 75), (‘Chinese’, 78), (‘English’, 96), (‘Math’, 80), (‘Science’, 60)]根据key值降序只要加个reverse=True就好了,因为sorted函数默认reverse=False,看下结果:print(sorted(final_result.items(),reverse=True)) # 根据key的值降序Out:[(‘Science’, 60), (‘Math’, 80), (‘English’, 96), (‘Chinese’, 78), (‘Art’, 75)]import operatorprint(sorted(final_result.items(),key=operator.itemgetter(0),reverse=True))Out:[(‘Science’, 60), (‘Math’, 80), (‘English’, 96), (‘Chinese’, 78), (‘Art’, 75)]print(sorted(final_result.items(),key=lambda x:x[0],reverse=True))Out:[(‘Science’, 60), (‘Math’, 80), (‘English’, 96), (‘Chinese’, 78), (‘Art’, 75)]有关lamba函数实在有太多可以总结的,我会在之后专门拿一期来讲,和filter reduce简直是神器,当我逐渐使用的多了后终于感受到了一点点pythonic的感觉,哈哈根据Value值排序其实大家看到了根据key的排序,也猜到了如何根据value 排序,让我们先看升序:print(sorted(final_result.items(),key=lambda x:x[1])) #根据Value升序Out:[(‘Science’, 60), (‘Art’, 75), (‘Chinese’, 78), (‘Math’, 80), (‘English’, 96)]import operatorprint(sorted(final_result.items(),key=operator.itemgetter(1)))Out:[(‘Science’, 60), (‘Art’, 75), (‘Chinese’, 78), (‘Math’, 80), (‘English’, 96)]降序也一样,无非就是加上reverse=True,这里不一一举例了:print(sorted(final_result.items(),key=lambda v:v[1],reverse=True))Out:[(‘English’, 96), (‘Math’, 80), (‘Chinese’, 78), (‘Art’, 75), (‘Science’, 60)]字典合并(Merge)在Python 3.5以上可以直接用**,是一个常用的小技巧,在此对于2.7的用户说一声对不起,技术一直说是喜新厌旧呀,让我们看一个小栗子:def Merge(dict1, dict2): res = {**dict1, **dict2} return resdict1 = {‘a’: 10, ‘b’: 8,‘c’:2}dict2 = {’d’: 6, ‘c’: 4}dict3 = Merge(dict1, dict2)print(dict3)Out:{‘a’: 10, ‘b’: 8, ‘c’: 4, ’d’: 6}这里顺序很重要,大家一定要看好是谁覆盖了谁,如果我们交换一下顺序就会变成这样:def Merge(dict1, dict2): res = {**dict2, **dict1} # 交换了顺序 return resdict1 = {‘a’: 10, ‘b’: 8,‘c’:2}dict2 = {’d’: 6, ‘c’: 4}dict3 = Merge(dict1, dict2)print(dict3)Out:{’d’: 6, ‘c’: 2, ‘a’: 10, ‘b’: 8}对于Python2的朋友们不用担心,自然有解决方案,那就是用update函数,也很方便,上代码:dict1 = {‘a’: 10, ‘b’: 8,‘c’:2}dict2 = {’d’: 6, ‘c’: 4}dict2.update(dict1)print(dict2)Out:{’d’: 6, ‘c’: 2, ‘a’: 10, ‘b’: 8}利用Json.dumps()美化输出dict我们如果碰到以下这种情况的dict,如果按照常规print输出会这样:my_mapping = {‘a’: 23, ‘b’: 42, ‘c’: 0xc0ffee}print(my_mapping)Out:{‘a’: 23, ‘b’: 42, ‘c’: 12648430}但是如果我们能引用json库里的dumps方法会得到好的多的效果:import jsonprint(json.dumps(my_mapping, indent=4, sort_keys=True))Out:{ “a”: 23, “b”: 42, “c”: 12648430 }字典参数解包Python里面方便神奇的方法很多,比如下面这个,可以实现解包字典:def unpack(k1,k2,k3): print(k1,k2,k3)my_dict = {‘k1’:‘value1’,‘k2’:‘value2’,‘k3’:‘value3’}unpack(**my_dict)Out: value1 value2 value3顺便提一下哈,有关 args和kwargs的方法我会专门在后面的一期讲,敬请期待!字典推导式这个我写的比较纠结,因为咨询了我的主管,他推荐我尽量不要用,我也不太懂其中原因,不知道有没有大神可以出来解答一下哈,具体用法和List的推导式一样,上代码:import jsonfirst = {x:‘A’+str(x) for x in range(8)}print(json.dumps(first,indent=4, sort_keys=True)) # 这种情况用json输出好看些 Out:{ “0”: “A0”, “1”: “A1”, “2”: “A2”, “3”: “A3”, “4”: “A4”, “5”: “A5”, “6”: “A6”, “7”: “A7” }或者可以这么用:second={v:k for k,v in first.items()}print(json.dumps(second,indent=4))Out:{ “A0”: 0, “A1”: 1, “A2”: 2, “A3”: 3, “A4”: 4, “A5”: 5, “A6”: 6, “A7”: 7 }至于其他乱七八糟的用法大家可以自己去想哈哈总结今天系统地为大家梳理了几点:创建字典不同方法字典排序字典合并字典解包json优化输出字典推导式希望可以帮到大家,后续如果我发想有什么有意思的方法和技巧我会加上,再次祝大家新年快乐!!!! ...

February 6, 2019 · 2 min · jiezi

React框架Umi实战(3)路由进阶

前面的课程都是使用的约定路由,就是自动生成的,但是我们做项目大部分都是涉及权限控制的,这时就还是得用控制路由,仅今天就来改进一下1 修改配置.umirc.js// ref: https://umijs.org/config/export default { plugins: [ // ref: https://umijs.org/plugin/umi-plugin-react.html [‘umi-plugin-react’, { antd: true, dva: true, dva: { immer: true }, dynamicImport: false, title: ‘umis’, dll: false, hardSource: false, routes: { exclude: [ /model.(j|t)sx?$/, /service.(j|t)sx?$/, /models//, /components//, /services//, ], }, }], ], routes: [ { path: ‘/’, component: ‘../layouts’, }, { path: ‘/users’, component: ‘../layouts’, Routes: [‘src/components/Authorized’], routes: [ { path: ‘/users’, component: ‘./users’ }, ], }, { path: ‘/login’, component: ‘../layouts’, routes: [ { path: ‘/login’, component: ‘./login’ }, ], }, { path: ‘/test’, component: ‘../layouts’, routes: [ { path: ‘/test’, component: ‘./test’ }, ], }, ]}一旦使用了配置路由,那么pages下的文件将不再生成路由。component的路径是相对于src\pages的。在需要权限控制的的路由下使用Routes属性配置。2 鉴权路由组件 components\Authorizedimport React, { Component } from ‘react’import { connect } from ‘dva’;import { Router, Route, Redirect, withRouter } from ‘dva/router’;import { message } from ‘antd’;class AuthRouter extends Component { render() { const { component: Component, …rest } = this.props const isLogged = false if (!isLogged) { message.warning(‘您需要先登陆’); } return ( <Route {…rest} render={props => { return isLogged ? <Component {…props} /> : <Redirect to="/login" /> }} /> ) }}function mapStateToProps(state) { return { state }}// export default ListData;export default connect(mapStateToProps)(withRouter(AuthRouter));里面的判断可以根具你自己的业务来写,我这边是跳转到登陆页面。3 登陆页面import { connect } from ‘dva’;function Login(){ return ( <div> <h1>this is login page</h1> </div> )}function mapStateToProps(state) { console.log(state.login); return { test:‘fhf’ };}export default connect(mapStateToProps)(Login);这样你访问/users 就会重定向到登陆页面:4 总结这样简单的umi使用就结束了,在我看来重点就这么多,大部分还是dva的使用,参考我之前的dva系列学一下就好了。这些框架其实都是比较好上手,关键还是React的基础要掌握好,还有es6的语法。如果你想要直接进入开发,建议不要自己再花时间搭建框架。即使你使用了umi自己按我所写的搭建出来,也没有直接用现成的快。而且重复造轮子,并没有什么意义。建议直接使用ant-design-prohttps://github.com/ant-design…,该有的都已经帮你搭好了,如果你也想开发后台管理的系统。别忘了关注我 mike啥都想搞还有其他后端技术分享在我的公众号。 ...

January 16, 2019 · 1 min · jiezi

markdown介绍及使用

了解及介绍markdown 今天忽然发现 markdown 是如此的强大,特别适合今后自己写技术博客,比如segmentfault、GitHub等技术社区参考以下博客:印象笔记终于支持 Markdown了,如何才能真正用好它?Markdown基本语法使用markdown参考以下使用教程:有道云笔记Markdown指南

December 26, 2018 · 1 min · jiezi