Python核心编程 第八章

8.1 if 语句

8.2 else语句

python 中的缩进使用强制使代码正确对齐,避免‘悬挂else’

8.3 elif语句

8.4条件表达式

8.5while语句

8.6 for 语句

    8.6.2 用于序列类型

            1.通过序列项迭代

                namelist =['walter','nicole', 'steven', 'henery']

                for eachname in namelist:

            2.通过序列索引迭代

                    for i in range(len(namelist)

            3.使用 项和索引迭代

                使用内建的函数enumerate()函数

                    for i ,eachLee in enumerate(namelist):

      8.6.4   range()内建函数

                  完整语法  range(start, end, step =1)

                   简略语法 range(end)

                                   range(start,end)

    8.6.5 xrange()内建函数

                    有一个很大的范围的时候,xrange()更适合,它只能被用在for循环中

    8.6.6 与序列相关的内建函数

                sorted()、reversed()、enumerate()、zip()

8.7 break 语句

            结束当前循环然后跳转到下条语句、

8.8 continue语句

            遇到continue语句的时候,程序会结束当前循环,并忽略剩余的语句,然后回到循环的顶端

8.9  pass语句

        无操作

        后来完成

8.10 再谈else语句

    在Python 中,while 和 for循环中也可以使用else语句,但else语句只在循环完成后执行,也就是说break语句会跳过else语句

 例:求最大约数,也提示这个数是否为素数 、。、。。。、。,

# -*-coding:utf-8 -*-
def showMaxFactor(num):
	count = num/2
	while count >1:
		if num % count ==0:
			print 'largest factor of %d is %d' %\
				(num,count)
			break
		count -= 1
	else:
		print num, "is prime"
for eachNum in range(10,21):
	showMaxFactor(eachNum)

8.11迭代器和iter()函数

跟不上说,迭代器是一个有next()方法的对象,而不是通过索引来计数

i.next()

1.序列

2.字典

for eachKey in myDict.keys()

3.文件

myFile = open('config-win.txt')

for eachLine in myFille

 

8.12 列表解析

map(lambda x:x**2, range(6))

[x**2 for x in range(6)]

filter(lambda x:x%2,seq)

[x for x in seq if x %2]

1.矩阵样列

2.磁盘文件样列

8.13 生成器表达式

生成器是特定的函数,允许返回一个值,然后暂停代码的执行,稍后恢复

 

 

8.15 练习

8.1 (a)C

        (b)  D

         (c) B

8.2 编写一个程序, 让用户输入三个数字: (f)rom, (t)o, 和 (i)ncrement . 以 i为步长, 从 f 计数到 t , 包括 f 和 t . 例如, 如果输入的是 f == 2, t == 26, i == 4 , 程序将输出 2, 6, 10, 14, 18, 22, 26.

# -*-coding:utf-8 -*-
def out():
	f = int(raw_input("enter a number as start"))
	t = int(raw_input("enter a number as end"))
	i = int(raw_input("enter a number as increment"))
	for j in range(f,t,i):
		print j

out()

8-3 .range()。如果我们需要生成下面的这些列表,分别需要在range()内建函数中提供哪些参数

(a) range(0,10,1)

(b) range(3,19,3)

(c)range(-20,861,220)

 

8-4

我们在本章已经给出了一些代码来确定一个数字的最大约数或者它是否是一个素数. 请把相关代码转换为一个返回值为布尔值的函数,函数名为 isprime() . 如果输入的是一个素数, 那么返回 True , 否则返回 False .

 

# -*-coding:utf-8 -*-
def isprime():
	num = int(raw_input("input a number"))
	if num ==1:
		print False
	count = num/2
	while count >1:
		if num % count ==0:
			print False
			break
		count -= 1
	else:
		print True
while 1:
	isprime()

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

# -*-coding:utf-8 -*-
def getfactors():
	list=[]
	num = int(raw_input("input a number"))
	for i in range(1,num+1):
		if num%i ==0:
			list.append(i)
	print list
while 1:
	getfactors()
		
	

8.6素因子分解. 以刚才练习中的 isprime() 和 getfactors() 函数为基础编写一个函数, 它接受一个整数作为参数, 返回该整数所有素数因子的列表. 这个过程叫做求素因子分解, 它输出的所有因子之积应该是原来的数字. 注意列表里可能有重复的元素. 例如输入 20 , 返回结果应该是 [2, 2, 5] .

a.

#-*-coding:utf-8 -*-
#判断是否为素数
def isprime(num):  
    if num==1:  
        return False  
    count=num/2  
    while count>1:  
        if num%count==0:  
            return False  
            break  
        count-=1  
    else:  
        return True  
  
def getfactors():
	num = int(raw_input('Enter a number:'))
	factors=[]
	#直接判断本身是否为素数
	if isprime(num):
		factors = [num]
	else:
	#最小的素数为2
		prime = 2
		count = num/2
	#从2开始先求出最小的素因数
		while prime<= count:
			if num%prime==0:
				factors.append(prime)
	#除以最小的素数A,继续循环A的最小素因素
				num/=prime #(用递归的思想解决)
			else:
				prime+=1
	return factors

print getfactors()

 

b.运算时间比较慢

# -*-coding:utf-8 -*-
#判断是否为素数
def isprime(num):
	if num ==1:
		return False
	count = num/2
	while count >1:
		if num %count ==0:
			return False
			break
		count -= 1
	else:
		return True
		
def getfactors(num):
	factors=[]  
	count=num/2  
	#判断约数里面是质数的,也就是质因数
	while count>1:  
		if isprime(count) and num%count==0:  
			factors.append(count)  
			num=num/count  
			count=num/2  
		else:  
			count-=1  
	#本身为素数的情况
	if num != 1:  
			factors.append(num)  
	factors.sort()
	return factors
num = int(raw_input('Enter a number:'))
print getfactors(num)  
	

c.

# -*-coding:utf-8 -*-
#判断是否为素数
def isprime(num):
	if num ==1:
		return False
	count = num/2
	while count >1:
		if num %count ==0:
			return False
			break
		count -= 1
	else:
		return True
			
def getfactors(num):
#调用isprime,判断是否为素数
	if isprime(num):
		print num
		
	else:
		prime = 2
		count = num/2
		while prime<= count:
			if num%prime==0:
				print prime
				#递归分解
				return getfactors(num/prime)
			else:
				prime+=1

num = int(raw_input("Enter a number"))
getfactors(num)

 

8.7  全数. 完全数被定义为这样的数字: 它的约数(不包括它自己)之和为它本身. 例如: 6的约数是 1, 2, 3, 因为 1 + 2 + 3 = 6 , 所以 6 被认为是一个完全数. 编写一个名为 isperfect()的函数, 它接受一个整数作为参数, 如果这个数字是完全数, 返回 1 ; 否则返回 0 .

 

# -*-coding:utf-8 -*-
def getfactors(num):
	#求出所有的约数
	list=[]
	s=0
	for i in range(1,num+1):
		if num%i ==0:
			list.append(i)
	#约数中包含本身,不能计算在内
	for j in range(0,len(list)-1):
		s+=list[j]
	if s==num:
		print 1
	else:
		print 0
num = int(raw_input("Enter a number"))
getfactors(num)

 

8.8 阶乘. 

一个数的阶乘被定义为从 1 到该数字所有数字的乘积. N 的阶乘简写为 N! .写一个函数, 指定N, 返回 N! 的值.

# -*-coding:utf-8 -*-
def factorial(num):
	if num ==1 or num==0:
		return 1
	elif num>=2:
		return num* factorial(num-1)
	else:
		return False
while 1:
	num = int(raw_input('Enter a number'))
	print factorial(num)

8.9Fibonacci 数列. Fibonacci 数列形如 1, 1, 2, 3, 5, 8, 13, 21, 等等. 也就是说,下一个值是序列中前两个值之和. 写一个函数, 给定 N , 返回第 N 个 Fibonacci 数字. 例如, 第1 个 Fibonacci 数字是 1 , 第 6 个是 8 .

# -*-coding:utf-8 -*-
def Fibonacci (num):
	if num==1 or num ==2:
		return 1
	else:
		return Fibonacci(num-1)+Fibonacci(num-2)
	
while 1:
	num = int(raw_input('Enter a number'))
	print Fibonacci(num)

8-10 空

8.11 要求输入一个姓名列表,输入格式是“Last Name, First Name,” 即 姓,逗号, 名. 编写程序处理输入, 如果用户输入错误, 比如“First Name Last Name,” , 请纠正这些错误, 并通知用户. 同时你还需要记录输入错误次数. 当用户输入结束后, 给列表排序, 然后以“姓 , 名" 的顺序显示.
输入输出示例(你不需要完全按照这里里例子完成):
% nametrack.py
Enter total number of names: 5
Please enter name 0: Smith, Joe
Please enter name 1: Mary 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, Mary

# -*-coding:utf-8 -*-
i = int(raw_input('Enter total number of names:'))
list =[]
error = 0
for j in range(0,i):
	name = raw_input('please enter name %d:' %j)
	#正确的输入
	if ','in name:
		list.append(name)
	else:
	#错误的输入及修正
		error+=1
		print "Wrong format...should be last,first"
		print "You have done this %d time(s) already.Fixing input..." %error
		name = name.split(' ')[1]+','+name.split(' ')[0]
		list.append(name)
list.sort()
print "The sorted list (by last name)is:"
for k in list:
	print "\t",k
	

8–12. (整数)位操作.编写一个程序, 用户给出起始和结束数字后给出一个下面这样的表格,分别显示出两个数字间所有整数的十进制, 二进制, 八进制和十六进制表示. 如果字符是可打印的ASCII 字符, 也要把它打印出来, 如果没有一个是可打印字符, 就省略掉 ASCII 那一栏的表头.

a.自己写的,有点麻烦,还乱、、、

# -*-coding:utf-8 -*-
#程序的问题在于转换后字符是有符号的,占位不一样 ,格式有点乱
print '-'*15
i = int(raw_input('    输入起始值:'))
j = int(raw_input('    输入结束值:'))
if 32<j<126:
	title = "DEC\tBIN\tOCT\tHEX\tASCII"
	print title
	print '-'*40
	#只有32以后的ASCII才显示,不然为空
	if i>32:
		for k in range(i,j+1):
			print k,'\t',bin(k),'\t',oct(k),'\t',hex(k),'\t',chr(k)
	else:
		for k in range(i,33):
			print k,'\t',bin(k),'\t',oct(k),'\t',hex(k)
		for k in range(33,j+1):
			print k,'\t',bin(k),'\t',oct(k),'\t',hex(k),'\t',chr(k)
		

else:
	title = "DEC\tBIN\tOCT\tHEX"
	print title
	print '-'*31
	for k in range(i,j+1):
		print k,'\t',bin(k),'\t',oct(k),'\t',hex(k)

b.别人的

start=int(raw_input('pls input a start number:'))  
end=int(raw_input('pls input a end number:'))  
title='DEC\tBIN\tOCT\tHEX'  
for i in range(start,end+1):  
    if 32<=i<=126:  
        title+='\tASCII'  
        break  
print title  
  
for i in range(start,end+1):  
    if 32<=i<=126:  
        print '%d\t%07d\t%o\t%x\t%s' %(i,int(bin(i)[2:]),i,i,chr(i))  
    else:  
        print '%d\t%07d\t%o\t%x' %(i,int(bin(i)[2:]),i,i)  

8-13

多了建立索引列表和遍历索引列表

转载于:https://my.oschina.net/finndai/blog/749582

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值