python getfactors 函数_python核心编程 第八章

=使用项和索引迭代=

使用内建函数 enumerate()函数

nameList = ['Donn', 'Shirley', 'Ben', 'Janice',... 'David', 'Yen', 'Wendy']

for i, eachLee in enumerate(nameList):

... print "%d %s Lee" % (i+1, eachLee)

...

1 Donn Lee

2 Shirley Lee

3 Ben Lee

4 Janice Lee

5 David Lee

6 Yen Lee

7 Wendy Lee

与序列有关的内建函数

xrange()类似range(),使用的情景是一个用于很大范围的列表,但是不可用于for循环以外的时候

sorted()返回一个已经排序的列表。

reversed()返回一个顺序颠倒的序列。

zip():传入两个列表,返回一个包含两个列表的列表。

以前的误解

continue 语句"立即启动循环的下一次迭代". 实际上, 当遇到continue 语句时, 程序会终止当前循环,并忽略剩余的语句, 然后回到循环的顶端.

else的其他使用方法。

在循环中使用时, else子句只在循环完成后执行, 也就是说 break 语句也会跳过 else 块.

迭代器

迭代器是什么:提供类序列对象的类序列接口

为什么使用迭代器:性能增强。创建了迭代接口,而不是随机对象访问。代码更加简洁。

如何使用迭代器:enumerate(),iter()返回一个迭代器,reversed()返回一个反序访问的迭代器。还有iterools模块,有各种迭代器。

any()和all(),如果迭代器的所有的值都为布尔真的话,返回值为真,感觉没什么用。

实际上使用for循环序列的话,会自己生成一个迭代器。

字典方法的迭代器:dict.iterkeys()通过keys迭代。dict.itervalues()通过values迭代。dict.iteritems()通过key-values来迭代。

4.迭代器的局限性:不能移动,不能回到开始。不能复制。迭代可变对象,不可以修改对象。

生成器与列表解析

生成器是列表解析的一个扩展。

列表解析:可以动态的创建列表。简单,灵活。

例子:[expr for iter_var in iterable if comdition]

for循环迭代iterable对象所有的条目,if 是筛选满足条件的条目,前面的expr应用于序列的每个成员。最后结果值是该表达式的列表。

例子:map(lambda x: x ** 2, range(6)) 这是一个计算序列成员平方的lmbda函数表达式:

扩展:

map(function, list)函数作用是,把list中所有元素都做函数的操作。

lambda函数表达式,相当于一个单条语句的函数。

上面的例子等效于>>>[x**2 for x in range(6)]

[0,1,4,9,16,25]

但是列表解析的效率更高。

更多的例子:迭代一个三行五列的矩阵。

[(x+1,y+1) for x in range(3) for y in range(5)]

生成器表达式

列表解析的一个不足就是必要生成所有的数据, 用以创建整个列表. 这可能对有大量数据的迭

代器有负面效应.(其实就是占内存) 生成器表达式通过结合列表解析和生成器解决了这个问题.

生成器表达式:(expr for iter_var in iterable if cond_expr)

不需要创建新的列表, 直接就可以创建配对. 我们可以使用下面的生成器表达式:

x_product_pairs = ((i, j) for i in rows for j in cols())

练习

8–5. 约数. 完成一个名为 getfactors() 的函数. 它接受一个整数作为参数, 返回它所有约数的列表, 包括 1 和它本身,

def getfactors(number):

return [x for x in range(1,number+1) if number%x==0]

列表解析真好用。。

8–6. 素因子分解. 以刚才练习中的 isprime() 和 getfactors() 函数为基础编写一个函

数, 它接受一个整数作为参数, 返回该整数所有素数因子的列表. 这个过程叫做求素因子分解, 它

输出的所有因子之积应该是原来的数字. 注意列表里可能有重复的元素. 例如输入 20 , 返回结果

应该是 [2, 2, 5] .

def getfactors(number):

return [x for x in range(1, number+1) if number%x==0]

def isprime(number):

"判断是否是素数"

return len(getfactors(number)) == 2

def factor_resolve(number):

factor = []

lists = getfactors(number)

lists = [lists[1],lists [-2]]

print lists

for i in lists:

if isprime(i):

factor.append(i)

else:

factor+=factor_resolve(i)

return factor

print factor_resolve(20)

8–7. 全数. 完全数被定义为这样的数字: 它的约数(不包括它自己)之和为它本身. 例如: 6

的约数是 1, 2, 3, 因为 1 + 2 + 3 = 6 , 所以 6 被认为是一个完全数. 编写一个名为 isperfect()的函数,

它接受一个整数作为参数, 如果这个数字是完全数, 返回 1 ; 否则返回 0 .

def getfactors(number):

return [x for x in range(1, number+1) if number%x==0 and number!=x]

def isperfect(number):

return sum(getfactors(number))==number

print isperfect(6)

8–8. 阶乘. 一个数的阶乘被定义为从 1 到该数字所有数字的乘积. N 的阶乘简写为 N! .

写一个函数, 指定 N, 返回 N! 的值.

def xmul(number):

return reduce(lambda x,y:x*y,range(1,number+1))

print xmul(4)

8–9. Fibonacci 数列. Fibonacci 数列形如 1, 1, 2, 3, 5, 8, 13, 21, 等等. 也就是说,

下一个值是序列中前两个值之和. 写一个函数, 给定 N , 返回第 N 个 Fibonacci 数字. 例如, 第

1 个 Fibonacci 数字是 1 , 第 6 个是 8 .

def series(number):

number_list = [1,1]

for i in range(number-2):

number_list.append(number_list[i]+number_list[i+1])

#print number_list

return number_list[number-1]

print series(100)

8–12. (整数)位操作. 编写一个程序, 用户给出起始和结束数字后给出一个下面这样的表格,

分别显示出两个数字间所有整数的十进制, 二进制, 八进制和十六进制表示. 如果字符是可打印的

ASCII 字符, 也要把它打印出来, 如果没有一个是可打印字符, 就省略掉 ASCII 那一栏的表头.

def number_form(start,stop):

number_list = []

for i in range(start,stop+1):

temporary_list = [i, hex(i), oct(i), bin(i)]

try:

temporary_list.append(chr(i))

except:

temporary_list.append(None)

number_list.append(temporary_list)

return number_list

for i in number_form(1,100):

print i

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值