8-1.条件语句。请看下面的代码:
# statement A
if x > 0:
# statement B
pass
elif x < 0:
# statement C
pass
else:
# statement D
pass
# statement E
(a)如果x<0,上面哪个语句(A,B,C,D,E)将被执行?
(b)如果x=0,上面哪个语句将被执行?
(c)如果x>0,上面哪个语句将被执行?
答:
(a)ACE
(b)ADE
(c)ABE
8-2.循环。编写一个程序,让用户输入3个数字:(f)rom,(t)o和(i)ncrement。以i为步长,从f计数到t,包括f和t。例如,如果输入的是f = 2,t = 26,i = 4,程序将输出2,6,10,14,18,22,26。
f = raw_input('from>>') t = raw_input('to>>') i = raw_input('increment>>') print range(int(f), int(t) + 1, int(i))
8-3.range()。如果我们需要生成下面的这些列表,分别需要在range()内建函数中提供那些参数?
(a)[0,1,2,3,4,5,6,7,8,9]
(b)[3,6,9,12,15,18]
(c)[-20,200,420,640,860]
print range(0, 10) print range(3, 19, 3) print range(-20, 861, 220)
8-4.素数。我们在本章已经给出了一些代码来确定一个数字的最大约数或者它是否是一个素数。请把相关代码转换为一个返回布尔值的函数,函数名为isprime()。如果输入的是一个素数,那么返回True,否者返回False.
def isprime(num): count = num / 2 while count > 1: if num % count == 0: return False break else: count -= 1 else: return True print isprime(7)
注:本来担心数值为1没有考虑进去,后来看看如果为1则会在while的else里判定,这下放心了。
再注:今天在做python练习的时候因为涉及性能问题所以想了想能优化的点,发现这样判断素数实在是效率太低了,因为从num/2开始遍历到2,这样的性能比2到num/2要低很多。所以只要改变下顺序,性能就能成倍提升。所以下面这种方法更简单一些。
另一种方法:
def isprime(num): switch = True if num <= -1: switch = True half = num / 2 for n in range(2, half): if num % half == 0: switch = False break return switch print isprime(17)
8-5.约数。完成一个名为getfactors()的函数。它接受一个整型作为参数,返回它所有约数的列表,包括1和它本身。
def getfactors(num): half = num / 2 if num == 1 else num fact = [] for n in range(1, half + 1): if num % n == 0: fact.append(n) return fact print getfactors(4)
8-6.素因子分解。以刚才练习中的isprime()和getfactors()函数为基础编写一个函数,它接受一个整型作为参数,返回该整型所有素数因子的列表。这个过程叫做求素因子分解,它输出的所有因子之积应该是原来的数字。注意列表里可能有重复的元素。例如输入20,返回的结果应该是[2,2,5]。
#coding=utf-8 def isprime(num): count = num / 2 while count >1: if num % count == 0: return False break else: count -= 1 else: return True def getfactor(num): l = [] if isprime(num): return [num] count = num / 2 for n in range(2, count + 1): if num % n == 0 and isprime(n): l.append(n) return l def suyinzi(num): fac = getfactor(num) mul = 1 for n in fac: mul *= n if mul == num: return fac else: return fac + suyinzi(num / mul) print suyinzi(16)
注:在一个高手的帮助下搞定了,链接http://bbs.chinaunix.net/thread-4060653-1-1.html
8-7.完全数。完全数被定义为这样的数字:它的约数(不包括它自己)之和为它本身。例如:6的约数是1,2,3,因为1+2+3=6,所以6被认为是一个完全数。编写一个名为isperfect()的函数,它接受一个整形作为参数,如果这个数字是完全数,返回1:否者返回0。
def fac(num): count = num / 2 l = [] for n in range(1, count+1): if num % n == 0 and isprime(n): l.append(n) return l def wanquan(num): l = fac(num) s = 0 for n in l: s += n if s == num: return 1 else: return 0 print wanquan(6)
注:有了8-6的基础这个容易多了。
8-8.阶乘。一个数的阶乘被定义为从1到该数字所有数字的乘积。N的阶层简写为N!。N! = factorial(N) = 1*2*3* ... *(N-2)*(N-1)*N。所以4! = 1*2*3*4。写一个函数,指定N,返回N!的值。
def jc(num): result = 1 for n in range(1, num + 1): result *= n return result print jc(5)
8-9.斐波那契数列。斐波那契数列形如1,1,2,3,5,8,13,21等等。也就是说,下一个值是序列中前两个值之和。写一个函数,给定N,返回第N个斐波那契数数字。例如,第1个斐波那契数字是1,第6个是8。
def feb(num): if num == 1: return 1 elif num == 2: return 1 else: return feb(num - 1) + feb(num - 2) print feb(8)
8-11.文本处理。要求输入一个姓名列表,输入格式是“Last Name, First Name”即姓逗号名。编写程序处理输入,如果用户输入错误,比如“Last Name First Name,”,请纠正这些错误,并通知用户。同时你还需要记录输入错误次数。当用户输入结束后,给列表排序,然后以“姓,名”的顺序显示。
输入输出示例(你不需要完全按照这里的例子完成):
% nametrack.py
Enter total number of names: 5
Please enter name 0: Smith, Joe
Please enter name 1: Marry Wong
>> Wrong format ... should be Last, First.
>> You have done this 1 time(s) already, Fixing input ...
Please enter name 2: Hamilton, Gerald
Please enter name 3: Royce, Linda
Please enter name 4: Winston Salem
>> Wrong format ... should be Last, First.
>> You have done this 2 time(s) already, Fixing input ...
The sorted list(by last name) is:
Hamilton, Gerald
Royce, Linda
Salem, Winston
Smith, Joe
Wong, Marry
namelist = [] count = 0 namecount = 1 while namecount <= 5: tag = 'Enter name %r >>' % namecount name = raw_input(tag) name = name.strip() if len(name.split(',')) == 2: namelist.append(name) namecount += 1 else: print 'Enter error - %d time.' %count count += 1 print namelist
注:下班前终于完成基本功能,回去再完善,补充上题目。