python核心编程第六章练习

#!/user/bin/env python
# -*- coding:utf-8 -*-


def findchr(string, char):
	'''(a)创建一个叫findchar()的函数,查找字符char是否在string中,找到就返回该值的索引,否则返回-1。'''
	if char in string:
		y = 0
		char_lens = len(char)
		string_lens = len(string)
		for i in range(string_lens):
			if char[y] == string[int(i)]:
				if y == char_lens-1:
					return int(i) - y
				y += 1
	else:
		return -1

print findchr('i am a boy', 'boy')
print findchr('i am a boy', 'girl')
print findchr('i am a babby boy', 'boy')

6-2

import string
import keyword

def idcheck(myInput):
	alphas = string.letters + '_'
	nums = string.digits
	alphanums = alphas + nums

	if len(myInput) > 0:
		if myInput[0] not in alphas:
			return 'invalid: first symbol must be alphabetic'

		elif myInput in keyword.kwlist:
			return 'You enter a keyword'

		else:
			for otherChar in myInput[1:]:

				if otherChar not in alphanums:
					return 'invalid: remaining symblos must be alphanumeric'
					break

			return "okay as an dentifier"

	return "invalid: input cannot be blank."

print idcheck('is')
print idcheck('')
print idcheck('you just good')
print idcheck('allright')

6-3

keysort = []
while True:
	k = raw_input('Enter digits! # as end ')
	if k != '#':
		keysort.append(k)
	else:
		break

print sorted(keysort,reverse = True)

6-4

def get_score_average():
	scores = []
	while True:
		print "Enter student's score, enter 8886 as end"
		score = input()
		if score >= 0 and score <= 100:
			scores.append(score)
		elif score == 8886:
			break
		else:
			# if you enter the wrong number, you coule get agerage you enter before
			mean_score = sum(scores)/ len(scores)
			return 'Invalid Enter',mean_score
	mean_score = sum(scores)/ len(scores)
	return mean_score

print get_score_average()

6-5(a)

def showstr():
    istr = raw_input('Input string: ')
    lens = len(istr)
    if lens==0:
        return False
    if lens==1:
        return istr
    for i,j in enumerate(istr):
        if i ==0:
            print j,istr[i+1]
        elif i == lens-1 and i != 0:
            print istr[i-1]
        else:
            print istr[i-1],j,istr[i+1]
    return True

print showstr()
6-5(b)

def mycmp():
	str1 = raw_input('> ')
	str2 = raw_input('> ')

	if len(str1) != len(str2):
		return False
	for i,j in enumerate(str1):
		if ord(j) - ord(str2[i]):
			return False

	return True

print mycmp()

6-5(c)

# -*- coding:utf-8 -*-
def isback():
    '''6-5(c)判断一个字符串是否是回文,忽略控制符号和空格[支持中文]'''
    import string
    # 控制符表示 ASCII 码中 0~31 以及127 这33个无法输出的字符
    denny = [chr(i) for i in xrange(0,32)]+list(string.whitespace)
    denny.append(chr(127))

    strs = raw_input('Please input string:')
    # 将输入的数据解码成unicode 因为在windows上默认是gbk,所以这里是gbk
    # 如果是在其他命令行中,应该以命令行输入的字符编码为主
    strs = strs.decode('gbk')
    new = []
    for i in strs:
        if i in denny:
            continue
        new.append(i)
    lens = len(new)
    if lens%2:
        return False
    else:
        half = lens/2
        if new[0:half] == new[-1:-half-1:-1]:
            return True
        return False

print isback()

6-5(d)

# -*- coding:utf-8 -*-
def back():
    '''6-5(d)接受一个字符,在其后面加一个反向的拷贝,构成一个回文字符串'''
    import string
    # 控制符表示 ASCII 码中 0~31 以及127 这33个无法输出的字符
    denny = [chr(i) for i in xrange(0,32)]+list(string.whitespace)
    denny.append(chr(127))

    strs = raw_input('Please input string:')
    # 将输入的数据解码成unicode 因为在windows上默认是gbk,所以这里是gbk
    # 如果是在其他命令行中,应该以命令行输入的字符编码为主
    strs = strs.decode('gbk')
    return strs + strs[::-1]

print back()

6-6

# -*- coding:utf-8 -*-
def strip2():
	'''接受一个字符串,去掉它前面和后面的空格'''
	string = raw_input('> input a string ')
	str_arr = list(string)
	lens = len(str_arr)
	# 只去除前面的空格
	for i in range(0,lens):
		if str_arr[i] == ' ':
			str_arr[i] = ''
		else:
			break
	# 只去除后面的空格
	for i in range(-1,-lens-1,-1):
		if str_arr[i] == ' ':
			str_arr[i] = ''
		else:
			break
	nstrs=""
	for i in range(0,lens):
		nstrs +=str_arr[i]
	return nstrs


print strip2()

6-7

#!/user/bin/env python
# -*- coding:utf-8 -*-

# 接受用户输入数字,并保存在num_str中
num_str = raw_input('Enter a number: ')

# 将接受回来的字符串转换成数字
num_num = int(num_str)

# 把小于输入数值但大于一的值保存在fac_list
fac_list = range(1, num_num+1)
print "BEFORE: ", fac_list

# 对i进行初始化0
i = 0

# 如果i小于fac_list的长度则进行循环
while i < len(fac_list):

	# 如果输入值能被所有小于他但大于一的值整除则删除
	if num_num % fac_list[i] == 0:
		del fac_list[i]
		# 与len(fac_list)同步减一
		i = i - 1
	# i进行计数
	i = i + 1

# 展示不能被输入值整除的数, 除掉所有约数
print "AFTER: ", fac_list

6-8

#!/user/bin/env python
# -*- coding:utf-8 -*-

def num2eng():
    '''给出一个整型值,返回代表该值的英文,比如输入89返回eight-nine。
    附加题:能够返回符合英文文法规则的形式,比如输入89返回eighty-nine。'''

    # 为了减少分类,故将零单独返值
    arr1 = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']  
    arr2 = ['ten', 'eleven', 'twele', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen']
    arr3 = ['twenty', 'thirty', 'fourty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety']

    new = ''

    num = raw_input('>Enter a number ')
    number = int(num)

    # 根据数值分割后进行分类讨论,首先保证取值范围在1000以内
    if number >0 and number <1000:
        # 对数值进行列表化
        num_list = list(num)
        # 10以内列表为['1~9'],故其位置位于列表的num_list[0]处,然后将其数值化,在表一进行查值返回
        if number < 10:
            new = arr1[int(num_list[0])] 
        # 10~19的英文单词比较特别所以单独列出,因为此时变量为个位,个位位于num_list[1]处,所以对其数值化并在表二查值返回
        elif number < 20:
            new = arr2[int(num_list[1])]
        # 100以内的为第三类,为了除掉像fifty- 这种情况,所以分两种情况,一种个位为零,一种个位不为零,原理同上。
        elif number < 100:
            if int(num_list[1]) == 0:
                new = arr3[int(num_list[0])-2]
            else:
                new = arr3[int(num_list[0])-2] + '-' + arr1[int(num_list[1])]
        # 100~999位一类,在其中分为四类,100单独一个,避免返回one handred and,其他跟上面类似,但是要考虑增加百位后各自在num_list中的位置
        else:
            if number == 100:
                new = 'one handred'
            else:
                if int(num_list[2]) == 0 and int(num_list[1]) != 1:
                    new =  arr1[int(num_list[0])] + ' handred and ' + arr3[int(num_list[1])-2]
                # 对十位单独分情况讨论,如果是一则参照表2
                elif int(num_list[1]) == 1:
                    new =  arr1[int(num_list[0])] + ' handred and ' + arr2[int(num_list[2])]
                else:
                    new =  arr1[int(num_list[0])] + ' handred and ' + arr3[int(num_list[1])-2] + '-' + arr1[int(num_list[2])] 

        return new
    # 零单独一类,可以减少上面因为零存在的讨论
    elif number == 0:
        return 'zero'
    # 因为在1000以内所以1000单独比较方便,如果到1000,000的话就要重新添加一类了
    elif number == 1000:
        return 'one thousand'
    else:
        return 'It must be small than 1000'


print num2eng()

6-10

import string

'''写一个函数,返回一个跟输入字符串相似的字符串,要求字符串的大小写反转。'''

uppercase = string.ascii_uppercase
lowercase = string.ascii_lowercase

def caseInvert(str):
	arr = []
	for i in str:
		if i in uppercase:
			i = i.lower()
		elif i in lowercase:
			i = i.upper()
		arr.append(i)
	return ''.join(arr)

print caseInvert('Mr.Ed')

6-12(a)

#!/user/bin/env python
# -*- coding:utf-8 -*-


def findchr(string, char):
	'''(a)创建一个叫findchar()的函数,查找字符char是否在string中,找到就返回该值的索引,否则返回-1。'''
	if char in string:
		y = 0
		char_lens = len(char)
		string_lens = len(string)
		for i in range(string_lens):
			if char[y] == string[int(i)]:
				if y == char_lens-1:
					return int(i) - y
				y += 1
	else:
		return -1

print findchr('i am a boy', 'boy')
print findchr('i am a boy', 'girl')
print findchr('i am a babby boy', 'boy')

6-12(b)

#!/user/bin/env python
# -*- coding:utf-8 -*-

def rfindchr(string, char):
	'''(b)创建另外一个叫rfindchar()的函数,查找字符char最后一次出现的位置。它跟findchr()
		工作类似,不过它是从字符串的最后开始向前查找的。'''

	if char in string:
		char_lens = len(char) -1
		string_lens = len(string)
		for i in range(string_lens)[::-1]:
			if char[char_lens] == string[int(i)]:
				if char_lens == 0:
					return int(i) + len(char) -1
				char_lens -= 1
	else:
		return -1

print rfindchr('i am a boy', 'am')
print rfindchr('i am a boy', 'girl')
print rfindchr('i am a babby boy', 'boy')

6-12(c)

#!/user/bin/env python
# -*- coding:utf-8 -*-


def subchr(string, char, newchar):
	'''(c)创建另外一个叫subchar()的函数,查找字符char是否在string中,找到就替代该字符并返回新字符串,否则返回-1。'''
	if char in string:
		y = 0
		char_lens = len(char)
		string_lens = len(string)
		for i in range(string_lens):
			if char[y] == string[int(i)]:
				if y == char_lens-1:
					string = string[0:int(i)-y] + newchar + string[int(i)+1:]
					return string
				y += 1
	else:
		return -1

print subchr('i am a boy', 'boy', 'girl')
print subchr('i am a boy', 'girl', 'boy')
print subchr('i am a babby boy', 'am', 'amnot')

6-13

#!/user/bin/env python
# -*- coding:utf-8 -*-

def atoc(string):
    '''6-13 输入字符串返回复数,只能用complex不能用eval'''
    cindex = string.rfind('-')
    if cindex <= 0:
        cindex = string.rfind('+')
    if cindex >0 :
        real = float(string[0:cindex])
        compl = float(string[cindex:-1])
    return complex(real,compl)

print atoc(-1.23

6-14

#!/user/bin/env python
# -*- coding:utf-8 -*-
import random

def rochambeau():
    arr = ['rock', 'shears', 'paper']
    print 'Input your select [0.rock 1.shears 2.paper]'
    user_input = input()
    cpu_input = random.randint(0, 2)
    print '--- You VS Computer ----------'
    print '\nYou[ %s ]\tComputer[ %s ]'%(arr[user_input], arr[cpu_input])
    if user_input == cpu_input:
        return '\n--- equal -----------------'
    elif user_input - cpu_input == 2 or user_input - cpu_input == -1:
        return '\n--- You win ---------------'
    else:
        return '\n--- You lost ----------------'

print rochambeau()

6-15(a)

#!/user/bin/env python
# -*- coding:utf-8 -*-
from five.is_leep_year import isleapyear
from isyear import isyearmodel

def caculatedate():
    startdate = raw_input('>Enter the startdate[dd/mm/yy] ')
    enddate = raw_input('>Enter the enddate[dd/mm/yy] ')
    if isyearmodel(startdate)[0] and isyearmodel(enddate)[0]:
        startdate = isyearmodel(startdate)[1]
        enddate = isyearmodel(enddate)[1]
    else:
        return 'invalid input'

    month_list = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]
    dd, mm, yy = 0, 1, 2
    if startdate[yy] == enddate[yy]:
        startdatecount = 365 - month_amout[startdate[mm]] - startdate[dd]
        enddatecount = month_amout[enddate[mm]] + startdate[dd]
        dayscount = startdatecount + enddatecount
        if isleapyear(startdate) is True and startdate[mm] <= 2 and startdate[dd] != 29:
            return dayscount +1
        else:
            return dayscount

    else:
        leap_year_compensation = 0
        startdatecount = 365 - month_amout[startdate[mm]] - startdate[dd]
        enddatecount = month_amout[enddate[mm]] + startdate[dd]
        yearscount2days = (enddate[yy] - startdate[yy] - 1) * 365
        dayscount = startdatecount + enddatecount + yearscount2days
        for i in xrange(startdate[yy], enddate[yy]+1):
            if isleapyear(i):
                leap_year_compensation += 1
        return dayscount + leap_year_compensation 

print caculatedate()

6-15(b)

#!/user/bin/env python
# -*- coding:utf-8 -*-
from five.is_leep_year import isleapyear
from isyear import isyearmodel

def caculatedate():
    # 客户端进行赋值
    startdate = raw_input('>Enter the startdate[dd/mm/yy] ')# 输入开始年份的日期
    enddate = raw_input('>Enter the enddate[dd/mm/yy] ')# 输入结束年份的日期


    # 对输入的格式进行判断,如果错误则返回错误信息
    if isyearmodel(startdate)[0] is False or isyearmodel(enddate)[0] is False:
        return isyearmodel(startdate)[1]


    # 否则进行赋值进行计算
    else:
        # 赋值
        startdate = isyearmodel(startdate)
        enddate = isyearmodel(enddate)
        
        # 初始化所有月份的天数,第一个位置留空,因为不会输入0月份
        month2days = ['', 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        # 初始化数值
        dd, mm, yy = 0, 1, 2
        # 闰年补偿天数
        leapyearcompesesion = 0
        dayscount = 0
        # 中间年份转换成天数,默认为0
        year2days = 0


        # 如果是同一年
        if startdate[yy] == enddate[yy]:
            # 如果是闰年二月份为29天
            if isleapyear(int(startdate[yy])):
                month2days[2] = 29
            # 从开始月份到结束月份的前一个月的天数相加
            for i in xrange(int(startdate[mm]), int(enddate[mm])):
                dayscount += month2days[i]
            # 计算公式是两个月间的所有天数减去开始月的日数再加上结束月的日数
            daysamout = dayscount - int(startdate[dd]) + int(enddate[dd])


        # 如果不是同一年
        else:
            # 开始日期的天数计算
            if isleapyear(int(startdate[yy])): # 如果是闰年二月份为29天
                month2days[2] = 29
            for i in xrange(int(startdate[mm]), 13):
                dayscount += month2days[i]
            startdatecount = dayscount - int(startdate[dd])

            # 计算结束日期的天数
            dayscount = 0 # 对dayscount归零
            month2days[2] = 28 # 避免上面年份是闰年导致二月份变成29天
            if isleapyear(int(enddate[yy])):
                month2days[2] = 29
            for i in xrange(1, int(enddate[mm])):
                dayscount +=month2days[i]
            enddatecount = dayscount + int(enddate[dd])
            
            # 有中间年份的进行运算,没有则按默认值,即0返回
            if enddate[yy] - startdate[yy] >1:
                year2days = (int(enddate[yy]) - int(startdate[yy]) -1) * 365
                for j in xrange(int(startdate[yy])+1, enddate[yy]):
                    if isleapyear(j):
                        leapyearcompesesion += 1

            # 总计天数计算
            daysamout = startdatecount + enddatecount + year2days + leapyearcompesesion

        return daysamout

print caculatedate()




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值