zoukankan      html  css  js  c++  java
  • python核心编程笔记——Chapter6

    Chapter 6.序列:字符串,列表和元组

    这章内容比较多啊,看得比较久,而且题目又难很多。

    6.1鉴定一个字符串是否是另外一个字符串的字串,这道题目不是很确定,好像没有直接的判定吧。

    直接是否内建的序列函数 in ?

    1 >>> a = 'or'
    2 >>> b = 'favorite'
    3 >>> a in b
    4 True

    strin模块也有类似的函数,不知道算不算

     1 >>> b.count(a)
     2 1
     3 >>> b.find(a)
     4 3
     5 >>> b.index(a)
     6 3
     7 >>> b.rindex(a)
     8 3
     9 >>> b.rindex(a)
    10 3

    6-2。修改idcheck.py脚本,使之可以检测长度为一的标识符,并且可以识别Python关键字(通过keyword模块的keyword.kwlist)来辅助。

    其实不太难,跟着感觉走就对了。

     1 #!/usr/bin/env python
     2 #-*-coding=utf-8-*-
     3 
     4 import string 
     5 import keyword
     6 
     7 alphas = string.letters + '_'
     8 nums = string.digits
     9 keywords = keyword.kwlist
    10 
    11 flag = True
    12 
    13 print 'Welcome to the Identifier Checker v2.0'
    14 myInput = raw_input('Identifier to test?')
    15 
    16 if len(myInput) >= 0:
    17     if myInput in keywords:
    18         flag = False
    19         print '''invalid:the identifier must not be keyword.'''
    20     elif myInput[0] not in alphas:
    21         flag = False
    22         print '''invalid:first symbol must be alphabetic'''
    23     else:
    24         for otherChar in myInput[1:]:
    25             if otherChar not in alphas+nums:
    26                 flag = False
    27                 print '''invalid:remaining symbols must be alphanumeric'''
    28                 break
    29     
    30     if flag == True:
    31         print '''okay as an identifier'''
    32 
    33     
    View Code

    6-3.对输入的一串数字分别进行从大到小的排列和用字典序从大到小排序,没难度,注意按字典序排序用的是sorted()函数

     1 #!/usr/bin/env python
     2 #-*-coding=utf-8-*-
     3 
     4 s = []
     5 a = input('请输入数字,输入0退出:')
     6 s.append(a)
     7 
     8 while a != 0 :
     9     a = input('请输入数字,输入0退出:')
    10     s.append(a)
    11 s.sort(reverse = True)
    12 print '从大到小排序得:',s
    13 print '按照字典序从大到小排列得:',sorted(s,reverse = True)

    6-6.创建一个string.strip()的替代函数。难度不大,由于字符串内部是不可变的,改变字符串估计得用切片操作了。

     1 #!/usr/bin/env python
     2 #-*-coding=utf-8-*-
     3 
     4 def Strips(str):
     5     for i in range(len(str)):
     6         if str[i] != ' ':
     7             str = str[i:]
     8             break
     9     for i in  range(-1,-len(str)-1,-1):
    10         if str[i] != ' ':
    11             str = str[:i+1]
    12             break
    13     return str
    14 
    15 if __name__ == '__main__':
    16     str = raw_input('请输入字符串:')
    17     print Strips(str)

    6-7.修改那个有bug的程序buggy.py,可以看看,目测那个程序应该是用来剔除序列长度的因子吧,修改一下bug得到:

     1 #!/usr/bin/env python 
     2 #-*-coding=utf-8-*-
     3 
     4 #
     5 num_str = raw_input('Enter a number: ')
     6 
     7 #
     8 num_num = int(num_str)
     9 
    10 #
    11 fac_list = range(1,num_num+1)
    12 print "BEFORE:",fac_list
    13 
    14 #
    15 i = 0
    16 
    17 #
    18 while i < len(fac_list):
    19     #
    20     if num_num % fac_list[i] == 0:
    21         del fac_list[i]
    22         i -= 1
    23     
    24     #
    25     i += 1
    26 
    27 #
    28 print "AFTER:",fac_list

    6-8.这道题目有点难度,要将一个数字转成合乎语法的英语单词,思路还是找两个列表把单词存起来。

     1 #!/usr/bin/env python
     2 #-*-coding=utf-8-*-
     3 
     4 def change(num):
     5     num_a = int(num)
     6     list1 = ['zero','one','two','three','four','five','six','seven','eight','nine',
     7         'ten','eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen',
     8         'eighteen','nineteen']
     9     list2 = ['zero','ten','twenty','thirty','forty','fifty','sixty','seventy','eighty','ninety']
    10     if num_a == 1000:
    11         return 'one thousand'
    12     if num_a == 0:
    13         return 'zero'
    14     if num_a >= 100 and num_a % 100 == 0:
    15         return list1[num_a / 100] + ' hundred'
    16     str = ''
    17     if num_a / 100 > 0 :
    18         str += list1[num_a / 100] + ' hundred and '
    19         num_a %= 100
    20     if num_a % 10 == 0:
    21         str += list2[num_a / 10]
    22         return str
    23     elif num_a < 20:
    24         str += list1[num_a]
    25         return str
    26     else:
    27         str += list2[num_a / 10] + '-' + list1[num_a % 10]
    28         return str
    29 
    30 if __name__ == '__main__':
    31     num = raw_input('请输入数字:')
    32     print change(num)

    6-10.转换,返回一个大小写反转的字符串,不难,用个突然发现string有个swapcase()的内建函数,能够翻转string的大小写,写都不用写了

    1 >>> cc = 'Mr.Ed'
    2 >>> cc.swapcase()
    3 'mR.eD'

    6-11.转换。写一个能从整型到IP地址相互转化的程序。这道题目一开始不懂得是什么意思,后来看网上大牛的回答,才知道考查的是10进制数与256进制数之间的相互转化。这里直接贴上大牛的代码,不班门弄斧了。值得一体的是,python3.3之后新增了ipaddress模块,可以直接使用。

     1 #!/usr/bin/env python
     2 #-*-coding=utf-8-*-
     3 
     4 def IntegerToIP(num):
     5     "Integer to IP"
     6     IP = [] 
     7     for i in range(4):
     8         IP.append(str(num%256))
     9         num /= 256
    10     return '.'.join(IP[::-1])
    11 
    12 def IPToInteger(IP):
    13     "IP to Interger"
    14     Integer = 0
    15     node = []
    16     node = IP.split('.')
    17 
    18     for i in range(-1,-len(node)-1,-1) :
    19         x = -(i+1) 
    20         Integer += int(node[i]) * (256 ** x)
    21 
    22     return Integer
    23 
    24 def test() :
    25     "Just for test"
    26     num = input("Enter a int Num : ") 
    27     print "The Integer to IP Address is : " ,IntegerToIP(num)
    28     print "The IP Address to Integer is : " ,IPToInteger(IntegerToIP(num))
    29 
    30 if '__main__' ==  __name__ :
    31     test()  

    6-12.字符串,自己实现在字符串里面索引的函数

     1 #!/usr/bin/env python
     2 #-*-coding=utf-8-*-
     3 
     4 def findchr(string,char):
     5     for i in range(len(string)):
     6         if string[i] == char:
     7             return i
     8 
     9     return -1
    10 
    11 def rfindchr(string,char):
    12     for i in range(-1,-len(string)-1,-1):
    13         if string[i] == char:
    14             return i+len(string)
    15     return -1
    16 
    17 def subchr(string,origchar,newchar):
    18     str = ''
    19     for ochar in string:
    20         if ochar == origchar:
    21             ochar = newchar
    22         str += ochar
    23     return str
    24 
    25 def test():
    26     s1 =  'finish'
    27     s2 = 'i'
    28     s3 = 'a'
    29     print findchr(s1,s2)
    30     print rfindchr(s1,s2)
    31     print subchr(s1,s2,s3)
    32 
    33 if __name__ =='__main__':
    34     test()             

    6-13.实现一个atoc(),其实python2.7已经完善了complex()函数,书上的例子直接可以用complex()来实现,跳过。

    1 >>> b = complex('-1.23e+4-5.67j')
    2 >>> type(b)
    3 <type 'complex'>
    4 >>> print b
    5 (-12300-5.67j)

    6-14.模拟剪刀石头布游戏,java写过,不想写了。

    6-15.求出两个日子的时间差,选用datetime模块超方便

     1 #!/usr/bin/env python
     2 #-*-coding=utf-8-*-
     3 
     4 import datetime
     5 
     6 def datedelta(date1,date2):
     7     l1 = date1.split('/')
     8     l2 = date2.split('/')
     9     datetime1 = datetime.date(int(l1[0]),int(l1[1]),int(l1[2]))
    10     datetime2 = datetime.date(int(l2[0]),int(l2[1]),int(l2[2]))
    11     return (datetime2 - datetime1).days
    12 
    13 def birthday(date):
    14     l1 = date.split('/')
    15     Date = datetime.date(int(l1[0]),int(l1[1]),int(l1[2]))
    16     Today = datetime.date.today()
    17     return (Today-Date).days
    18 
    19 def nextbirthday(date):
    20     l1 = date.split('/')
    21     Today = datetime.date.today()
    22     Year = Today.year
    23     Date1 = datetime.date(Year,int(l1[1]),int(l1[2]))
    24     Date2 = datetime.date(Year+1,int(l1[1]),int(l1[2]))
    25     if (Date1 - Today).days > 0:
    26                return (Date1 - Today).days
    27     else:
    28         return (Date2 - Today).days
    29 
    30 if __name__ == '__main__':
    31     print '请输入两个可识别的日期:'
    32     d1 = raw_input('date1:')
    33     d2 = raw_input('date2:')
    34     d1 = d1.strip()
    35     d2 = d2.strip()
    36     print '两个日期之间的天数为:',datedelta(d1,d2),'days'
    37     birth = raw_input('请输入你的生日:')
    38     print '从你出生到现在的天数为:',birthday(birth),'days'
    39     print '到你下次过生日还有:',nextbirthday(birth),'days'

    6-16.矩阵,处理矩阵M与N的加和乘运算,直接使用那个numpy模块,直接搞定。

     1 >>> from numpy import matrix
     2 >>> M = matrix('1,2,3;2,3,4;3,4,5')
     3 >>> N = matrix('1,2,3;2,3,4;3,4,5')
     4 >>> M+N
     5 matrix([[ 2,  4,  6],
     6         [ 4,  6,  8],
     7         [ 6,  8, 10]])
     8 >>> M*N
     9 matrix([[14, 20, 26],
    10         [20, 29, 38],
    11         [26, 38, 50]])

    6-17.实现一个myPop()函数,用一个列表作为输入,移除列表的最新一个元素,并返回它。看不懂题目,首先何谓最新,如果列表之前中间新插入一个数,但方法无法跟踪啊。

    所以不做了。

    6-18.看网上的答案都说返回元组,但是我自己写了个却是返回list类型到底谁对谁错呢?

    1 >>> fn=['hello','hi','ha']
    2 >>> ls=['John','Tony','Kelly']
    3 >>> zip(fn,ls)
    4 [('hello', 'John'), ('hi', 'Tony'), ('ha', 'Kelly')]
    5 >>> type(zip(fn,ls))
    6 <type 'list'>

    6-19.太麻烦了,不想写,而且似乎要考虑的东西和细节蛮多的,建议大家看看这个大牛的csdn博客,程序一遍遍地修改,非常屌!

    http://blog.csdn.net/fzyz_sb/article/details/8986260

    就这样,请多多指教!

  • 相关阅读:
    [bzoj2259][Oibh]新型计算机_Dijkstra
    [bzoj1660][Usaco2006 Nov]Bad Hair Day_单调栈
    [bzoj3943][Usaco2015 Feb]SuperBull_Kruskal
    [bzoj2131]免费的馅饼_树状数组
    [bzoj3932][CQOI2015]任务查询系统_主席树
    软件图标大全网站
    提示用户一直输入数字(默认为正整数),当用户输入end的时候显示当前输入数字中的最大值。
    打印多边形的菱形(for的嵌套)
    while循环问题(老师询问问题,学生回答。学生会了可以放学,或者老师讲了10遍,还是没有会的,被迫无奈也要放学。)
    while练习:输入一个班级的人数,然后依次输入学员成绩,计算班级学员的平均成绩和总成绩。
  • 原文地址:https://www.cnblogs.com/sysu-blackbear/p/3450380.html
Copyright © 2011-2022 走看看