6-1.字符串。string模块中是否有一种字符串方法或者函数可以帮助我鉴定一下字符串是否是另一个大字符穿的一部分?
答案: 存在一个方法:find(sub, beg, end)
参数解释:(1)sub是要检测的子字符串;
(2)beg是大字符穿中检索时的起始位置,默认值是0;
(3)end是检索时的终止位置,默认是-1
(4)[beg, end]类似于索引切片,最终检索位置不包括end
返回值:(1)如果检索成功,返回sub串出现的位置
(2)如果失败,返回-1
例:>>> s = "xysdls"
>>> s.find("s")
2
>>> s.find("ys")
1
>>> s.find("yd")
-1
6-2. 字符串标识符。修改例6-1的idcheck.py脚本,使之可以检测长度为1的标识符,并且可以识别关键字。对于后一个要求,你可以使用keyword模块(特别是keyword.kelist)来辅助。
代码如下:
1 #!/usr/bin/env python
2 #-*-coding: utf-8-*-
3
4 "idcheck.py -- check the descriptor"
5
6 import string
7 import keyword
8
9 alphas = string.letters + '_' #string.letters返回一个字符串,string.digits也返回一个字符串
10 nums = string.digits
11 alp_nums = alphas + nums
12 keylist = keyword.kwlist
13
14 print "Welcome to the identifier checker 1.0"
15
16 while True:
17 my_choice = raw_input("identifier to test?(Y or N): ")
18
19 if my_choice != "Y" and my_choice != "N":
20 print "please choose Y or N"
21
22 if my_choice == "N":
23 print "thanks for use! goodbye!"
24 break
25
26 if my_choice == "Y":
27 get_input = raw_input("Please enter your identifier: ")
28 length = len(get_input)
29
30 if length == 0:
31 print "Please enter some chars"
32
33 if length == 1:
34 if get_input not in alphas:
35 print "invalid identifier: the first char must be alphabetic"
36 elif get_input in keylist:
37 print "unvalid: It is a keyword"
38 else:
39 print "Okay as an identifier"
40
41 if length > 1:
42 firstchar = get_input[0]
43 otherchar = get_input[1:]
44
45 if get_input in keylist:
46 print "unvalid: It is a keyword"
47 elif firstchar not in alphas:
48 print "invalid: first char must be alphabetic"
49 else:
50 for eachchar in otherchar:
51 if eachchar not in alp_nums:
52 print "invalid: remaining symbols must be alphanumeric"
53 break
54 else:
55 print "Okay as an identifier"
56 print "Done!"
6-3. 排序。
(a)输入一个字符串,并从大到小排序。
(b)跟a一样,不过要用字典序从大到小排序
代码如下:
a. 按大小排序
1 #!/usr/bin/env python
2 #-*-coding: utf-8-*-
3
4 """a 按大小排序"""
5
6 getInput = raw_input("please enter a list of number: ")
7 getInput = getInput.split()
8
9 numL = []
10 for eachNum in getInput:
11 eachNum = int(eachNum)
12 numL.append(eachNum)
13
14 sortL = sorted(numL, reverse = True)
15 for eachNum in sortL:
16 print eachNum,
b. 按字典序排序
1 #!/usr/bin/env python
2 #-*-coding: utf-8-*-
3
4 """a 按字典序(即ASCII值)排序,sorted对于字符串类型排序用的是字典序"""
5
6 getInput = raw_input("please enter a list of number: ")
7 getInput = getInput.split()
8
9 sortL = sorted(getInput, reverse=True)
10
11 for eachNum in sortL:
12 print eachNum,
6-4. 算数。更新上一章里面你的得分测试练习方案,把测试得分放入一个列表中去,你的代码应该可以计算出一个平均分,见练习2-9和练习5-3.
代码如下:
1 #!/usr/bin/env python
2 #-*-coding: utf-8-*-
3
4 def test(score):
5 if score > 100 or score < 0:
6 return "your input invalid"
7 if 90 <= score <= 100:
8 return "A"
9 if 80 <= score <= 89:
10 return "B"
11 if 70 <= score <= 79:
12 return "C"
13 if 60 <= score <= 69:
14 return "D"
15 if score < 60:
16 return "F"
17
18 def main():
19 L = []
20 while True:
21 getInput = raw_input("Please enter your score(press 'q' to quit): ")
22 if getInput == 'q':
23 break
24 getInput = float(getInput)
25 result = test(getInput)
26 if result not in "ABCDF":
27 print result
28 else:
29 print "Your score is %s" % result
30 L.append(getInput)
31 length = len(L)
32 mean = sum(L) / length
33 print "The mean of your input is %.2f" % mean
34
35 if __name__ == '__main__':
36 main()
6-5.字符串。
(a)更新你在2-7里面的方案,使之可以每次向前向后都显示一个字符串的一个字符。
1 #!/usr/bin/env python
2 #-*-coding: utf-8-*-
3
4 """#循环和字符串。从用户那里接受一个输入,然后逐个字符显示该字符串。下一次比前一次多一个字符"""
5
6 get_input = raw_input("please enter a string: ")
7 length = len(get_input)
8 L = range(1, length + 1)
9 for i in L:
10 print get_input[:i]
11 print "It's done!"
1 #!/usr/bin/env python
2 #-*-coding: utf-8-*-
3
4 """#循环和字符串。从用户那里接受一个输入,然后逐个字符显示该字符串。下一次比前一次少一个字符"""
5
6 get_input = raw_input("please enter a string: ")
7 length = len(get_input)
8 L = [None] + range(-1, -length, -1)
9 for i in L:
10 print get_input[:i]
11 print "It's done!"
(b)通过扫描来判断两个字符串是否匹配(不能使用比较操作符和cmp()内建函数)
1 #!/usr/bin/env python
2 #-*-coding: utf-8-*-
3
4 getInput = raw_input("Please enter two string: ")
5 getInput = getInput.split()
6 str1 = getInput[0].lower()
7 str2 = getInput[1].lower()
8 len1 = len(str1)
9 len2 = len(str2)
10
11 if len1 != len2:
12 print "Not equal!"
13 if len1 == len2:
14 L = range(len1)
15 for i in L:
16 if str1[i] != str2[i]:
17 print "Not equal!"
18 break
19 print "equal!"
(c)判断一个字符串是否重现(后面跟前面的一致即是否回文)
1 #!/usr/bin/env python
2 #-*-coding: utf-8-*-
3
4 #判断一个字符串是否重现(后面跟前面的一致)
5 def Palindrome(s):
6 l = len(s)
7 if l < 2:
8 return False
9
10 if l % 2 == 0:
11 end = l / 2
12 else:
13 end = l / 2 + 1
14
15 for i in xrange(end):
16 if s[i] != s[-(i + 1)]:
17 return False
18 else:
19 return True
20
21 def test():
22 while True:
23 getInput = raw_input("Please enter an string('q' to quit): ")
24 length = len(getInput)
25 if length == 0:
26 print "No input"
27 continue
28 if getInput == 'q':
29 break
30 bl = Palindrome(getInput)
31 if bl:
32 print "The string is a Palindrome"
33 else:
34 print "The string is not a Palindrome"
35
36 if __name__ == '__main__':
37 test()
附加题:在处理了严格回文之外,加入对例如控制符号和空格的支持。
(d)接受一个字符串在其后面加上一个反向的拷贝,构成一个回文字符串
1 #!/usr/bin/env python
2 #-*-coding: utf-8-*-
3
4 #接受一个字符,在其后面加上一个反向拷贝,构成一个回文字符串
5
6 def convert(s):
7 s_1 = s[::-1]
8 return "%s%s" % (s, s_1)
9
10 def test():
11 while True:
12 getInput = raw_input("Please enter a string: ")
13 length = len(getInput)
14 if length == 0:
15 print "No input"
16 continue
17 if getInput == 'q':
18 break
19 s = convert(getInput)
20 print "The final output is '%s'" % s
21
22 if __name__ == '__main__':
23 test()
6-6.字符串。创建一个strin.strip()的替代函数:接受一个字符串,去掉它前面和后面的空格(如果使用string.*strip()函数,那么本练习就没有意义了)
1 #!/usr/bin/env python
2 #-*-coding: utf-8-*-
3
4 def nstrip(s):
5 length = len(s)
6 L = range(length)
7 for i in L:
8 if s[i] == ' ':
9 pass
10 else:
11 s = s[i:]
12 break
13 length = len(s)
14 L = range(-1, -(length+1), -1)
15 for i in L:
16 if s[i] == ' ':
17 pass
18 else:
19 s = s[-length:i+1]
20 break
21 return s
22
23 def test():
24 while True:
25 getInput = raw_input("Please enter a string('q' to quit): ")
26 length = len(getInput)
27 if length == 0:
28 print "No input"
29 break
30 if getInput == 'q':
31 break
32 s = nstrip(getInput)
33 print "The final string is '%s'" % s
34
35 if __name__ == '__main__':
36 test()
6-7
1 #/usr/bin/env python
2 #-*-coding: utf-8-*-
3 while True:
4 num_str = raw_input("please input a number"
5 "('q' to quit!): ")
6 if len(num_str) == 0:
7 print "No input!"
8 break
9 if num_str == 'q':
10 print "thanks for use!"
11 break
12 #如果输入的不是数字字符串,那么就报错,并且打印提示信息
13 try:
14 num_num = int(num_str)
15 except Exception, e:
16 print "%s: %s" % (e.__class__.__name__, e)
17 else:
18 fac_list = range(1, num_num + 1)
19
20 print "BEFORE: ", fac_list
21
22 i = 0
23 l = []
24 while i < len(fac_list):
25 if num_num % fac_list[i] != 0:
26 l.append(fac_list[i])
27 i += 1
28 fac_list = l
29 print "AFTER: ", fac_list
6-8
1 #/usr/bin/env python
2 #-*-coding: utf-8-*-
3
4 def convert_num_to_str(num):
5 if num == 0:
6 return 'zero'
7 if num == 1:
8 return 'one'
9 if num == 2:
10 return 'two'
11 if num == 3:
12 return 'three'
13 if num == 4:
14 return 'four'
15 if num == 5:
16 return 'five'
17 if num == 6:
18 return 'six'
19 if num == 7:
20 return 'seven'
21 if num == 8:
22 return 'eight'
23 if num == 9:
24 return 'nine'
25
26
27 while True:
28 L_num = []
29 L_str = []
30 getInput = raw_input("Please enter a number(>= 0 and <= 1000)"
31 "('q' to quit!): ")
32 if len(getInput) == 0:
33 print "No input"
34 break
35 if getInput == 'q':
36 print "thanks for use!"
37 break
38 num = int(getInput)
39 if (num > 1000) or (num < 0):
40 print "Please enter number between 0 and 1000"
41 continue
42 for x in getInput:
43 L_num.append(int(x))
44 for x in L_num:
45 L_str.append(convert_num_to_str(x))
46 s = "-".join(L_str)
47 print s
6-10
1 #/usr/bin/env python
2 #-*-coding: utf-8-*-
3
4
5 def my_swapcase(S):
6 s = ''
7 for x in S:
8 if not x.isalpha():
9 s += x
10 elif x.islower():
11 s += x.upper()
12 elif x.isupper():
13 s += x.lower()
14 return s
15
16
17 def test():
18 while True:
19 getInput = raw_input("Please enter a string('q'to quit): ")
20 if getInput == 'q':
21 result = my_swapcase(getInput)
22 print result
23 print "thanks for use!"
24 break
25 if len(getInput) == 0:
26 print "No input"
27 continue
28 result = my_swapcase(getInput)
29 print result
30
31 if __name__ == '__main__':
32 test()
6-11
1 #/usr/bin/env python
2 #-*-coding: utf-8-*-
3
4 #IP地址在数据库中以整数形式存储:IP存储的整数与点分十进制有如下关系:
5 #IP: a.b.c.d number:((a*256+b)*256+c)*256+d
6
7 def num_to_ip(num):
8 L = []
9 for x in xrange(0, 4):
10 L.append(str(num % 256))
11 num /= 256
12 s = ".".join(L[::-1])
13 return s
14
15 def ip_to_num(ip):
16 L = ip.split(".")
17 L = [int(j) * (256 ** i) for i, j in enumerate(L[::-1])]
18 num = sum(L)
19 return num
20
21 def test():
22 while True:
23 getIn = raw_input("Please enter your input('q' to quit!): ")
24 if len(getIn) == 0:
25 print "No input"
26 continue
27 if getIn == 'q':
28 print "thanks for use!"
29 break
30 if '.' not in getIn:
31 print num_to_ip(int(getIn))
32 else:
33 print ip_to_num(getIn)
34
35 if __name__ == '__main__':
36 test()
6-12
1 #/usr/bin/env python
2 #-*-coding: utf-8-*-
3
4 def findchr(string, char):
5 if char not in string:
6 return -1
7 if char in string:
8 for i, j in enumerate(string):
9 if char == j:
10 return i
11
12 def rfindchr(string, char):
13 if char not in string:
14 return -1
15 if char in string:
16 for i, j in enumerate(string[::-1]):
17 if char == j:
18 return len(string) - (i + 1)
19
20 def subchr(string, origchar, newchar):
21 if origchar not in string:
22 return -1
23 if origchar in string:
24 for i, j in enumerate(string):
25 if origchar == j:
26 string = newchar.join(
27 (string[:i], string[i+1:]))
28 return string
29
30 def test():
31 print findchr("askbdnasfdl", 's')
32 print rfindchr("saklnLKND;SaNK", 'a')
33 print subchr("asbkjbakl", 'a', 's')
34
35 if __name__ == '__main__':
36 test()
6-13
1 #!/usr/bin/env python
2 #-*-coding: utf-8-*-
3
4 def atoc(string):
5
6 if 'j' not in string:
7 return complex(string)
8
9 if string[0] == '-':
10 if '-' in string[1:]:
11 string = string[1:].split("-")
12 string[0] = '-' + string[0]
13 string[1] = '-' + string[1]
14 if '+' in string[1:]:
15 string = string.split("+")
16 if string[0] == '+':
17 if '-' in string[1:]:
18 string = string.split("-")
19 string[1] = '-' + string[1]
20 if '+' in string[1:]:
21 string = string.split("+")
22 if string[0] != '-' and string[0] != '+':
23 if '-' in string:
24 string = string.split("-")
25 string[1] = '-' + string[1]
26 if '+' in string:
27 string = string.split("+")
28 real = float(string[0])
29 img = float(string[1][:-1])
30 return complex(real, img)
31
32
33 def test():
34 while True:
35 getIn = raw_input("Please enter a complex string('q' to quit): ")
36 if len(getIn) == 0:
37 print "No input!"
38 continue
39 if getIn == 'q':
40 print "Thanks for use!"
41 break
42 comp = atoc(getIn)
43 print "The complex is", comp
44
45 if __name__ == '__main__':
46 test()