如果函数要返回一系列结果,我们常见的方法就是将结果放到一份列表中,然后返回给调用者。比如下面的函数,返回字符串中每个单词的首字母在真个字符串中的索引:
安丘网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联公司自2013年起到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司。
运行结果:
上述的结果完全符合我们的预期,但 get_word_index 函数不够简洁。下面我们尝试使用生成器来实现:
运行结果:
改写之后,不仅运行结果符合要求,由于不需要和 result 列表交互,函数也变得非常简洁。下面我们就来详细学习下生成器吧~
生成器是指使用 yield 表达式的函数,调用生成器函数时,它并不会真的运行,而是会返回迭代器。每次在这个迭代器上面调用内置的 next 函数时,迭代器就会把生成器推进到下一个 yield 表达式那里。生成器传给 yield 的值均会由迭代器返回给调用者。
此外,如果输入量非常大,使用列表作为返回值,那么程序就有可能耗尽内存并崩溃。相反,使用生成器之后,则可以应对任意长度的输入数据。
例如,下面这个生成器函数可以获取文件中单词的索引,而不管文件内容多大,该函数执行时消耗的内存,只由单行的文本长度决定:
其中 test_generator.txt 中的内容如下:
运行结果:
下面这句话特别重要: 生成器函数返回的迭代器,是由状态的,及调用者不应该反复使用它 。我们那 word_index_iter 来说明:
如果想重复调用,请将其封装成容器:
运行结果:
关于上述自定义容器的实现原理,我的另外一篇文章做了详细介绍,链接奉上:
Python中的find( )方法
用于检验字符串是否包含子字符串str,如果已指定beg和end范围,则检验将在制定范围内。
如果包含字符串,返回开始的索引值,否则返回-1。
语法:str.find(str,beg=0,end=len(string))
str——指定检索的字符串
beg——开始索引,默认为0
end——结束索引,默认为字符串的长度
find()函数找不到时返回为-1。
第11题
因为取字符串TempStr的从TempStr[3]到TempStr[-2]的字符,
这里的下标都是从0开始,Python的数学取值区间都是[3,-1)半开区间,
因此取值范围是[3,-2],运行结果是3.14159
第13题
这是一个求400到500间的水仙花数的程序,水仙花数是指各个数位上的数的3次方的和等于这个数本身的3位数,
变量i是取这个3位数的百位上的数字,变量j是取这个3位数的十位上的数字,变量k是取这个3位数的个位上的数字,
如果这个数等于各个数位上的数的3次方的和,则打印这个数,在400到500中水仙花数只有407.
你也可以用4*4*4+0*0*0+7*7*7=64+0+343=407来判断答案是A,408不满足上述条件,153和159不在400到500范围内
第43题
Python中的list中的index函数是返回字符串's'在list中的索引位置(Python的索引下标都是从0开始),后面的5和10,是可选项表示查找从下标5到下标10的范围,
因为Python都是半开区间,所以实际范围为[5,9]区间,所以在"ky is"中查找's',其索引位置在整个字符串中是9,返回打印9
使用python做机器学习的一般都是从k-近邻算法开始学习。
这就很难绕开argsort()函数,但是在使用argsort()函数时大部分初学者都会被绕晕进去。
argsort()函数是用来返回数组值从小到大索引值的。举例
那么
下面讲一下详细逻辑:
我们把矩阵a从小到大排序,记排序后的矩阵为b:
矩阵a和b的关系:
所以a.argsort(),也就是a排序后索引值就是[1,2,0]
PS:索引值相当于页数,是一个排序值,不等于元素的值。
像书的目录一样,对于例子中的矩阵,我们有如下索引:
6............0
4............1
5............2
所以排序后b=[4,5,6],用索引值来表达就是[1,2,0]
numpy中有函数argsort来返回排序后的下标
结果
pytorch中的torch.sort本身就能返回排序后的下标
Python中没有直接调用的接口,怎么办呢?
用enumerate再排序就可以了
结果