Python 学习笔记(五)杂项

1. Assert

assert len(unique_characters) <= 10, 'Too many letters'

#…等价于:

if len(unique_characters) > 10:

    raise AssertionError('Too many letters'

2.找出不同字母

>>> words = ['SEND', 'MORE', 'MONEY']

>>> ''.join(words)                   #join 字符串连接符

'SENDMOREMONEY'

>>> set(''.join(words))              #set 返回不重复字符

{'E', 'D', 'M', 'O', 'N', 'S', 'R', 'Y'}

3. List Set Tuple

>>> unique_characters = {'E', 'D', 'M', 'O', 'N', 'S', 'R', 'Y'}

>>> tuple(ord(c) for c in unique_characters)

(89, 83, 82, 77, 79, 78, 69, 68)

>>> set(ord(c) for c in unique_characters)

{68, 69, 77, 78, 79, 82, 83, 89}

>>> list(ord(c) for c in unique_characters)

[89, 83, 82, 77, 79, 78, 69, 68]

4. 排列

list(itertools.permutations('ABC', 3))    #取ABC 3个元素的排列组合

[('A', 'B', 'C'), ('A', 'C', 'B'),

 ('B', 'A', 'C'), ('B', 'C', 'A'),

 ('C', 'A', 'B'), ('C', 'B', 'A')]

5. 排列分组

>>> names = ['Alex', 'Anne', 'Chris', 'Dora', 'Ethan','John', 'Lizzie', 'Mike', 'Sarah', 'Wesley']

>>> import itertools

>>> groups = itertools.groupby(names,len)

>>> groups

<itertools.groupby object at 0x01433F30>

>>> list(groups)

[(4, <itertools._grouper object at 0x013DA830>),

 (5, <itertools._grouper object at 0x01426190>),

 (4, <itertools._grouper object at 0x01426C70>),

 (5, <itertools._grouper object at 0x01426130>),

 (4, <itertools._grouper object at 0x01426030>),

 (6, <itertools._grouper object at 0x014261D0>),

 (4, <itertools._grouper object at 0x014265D0>),

 (5, <itertools._grouper object at 0x01426110>),

 (6, <itertools._grouper object at 0x01426150>)]

>>> names = sorted(names,key=len) #列表需要排序才能group by >>> names

['Alex',

 'Anne',

 'Dora',

 'John',

 'Mike',

 'Chris',

 'Ethan',

 'Sarah',

 'Lizzie',

 'Wesley']

>>> A = itertools.groupby(names,len)

>>> list(A)  #调用list() 函数会“耗尽”这个迭代器, 也就是说 你生成了迭代器中所有元素才创造了这个列表

[(4, <itertools._grouper object at 0x014261D0>),

 (5, <itertools._grouper object at 0x014268D0>),

 (6, <itertools._grouper object at 0x01426C90>)]

>>> for name_len, name_iter in A:  #List(A) 为空

...     print('%d' %(name_len))

...     for name in name_iter:

...         print(name)

...         

>>> 

>>> A = itertools.groupby(names,len) #重新产生 >>> for name_len, name_iter in A:

...     print('%d' %(name_len))

...     for name in name_iter:

...         print(name)

...         

4

Alex

Anne

Dora

John

Mike

5

Chris

Ethan

Sarah

6

Lizzie

Wesley

 6. List 的extend 和append的差别

>>> a_list = ['a','b','c']

>>> a_list.extend(['d','e']) #extend() 方法只接受一个参数,而该参数总是一个列表

>>> a_list

['a', 'b', 'c', 'd', 'e']

>>> len(a_list)

5

>>> a_list.append(['f','g']) #append() 方法只接受一个参数,但可以是任何数据类型

>>> a_list

['a', 'b', 'c', 'd', 'e', ['f', 'g']]

>>> len(a_list)

6

7. Set 的discard和remove的差别

>>> a_set = {1, 3, 6, 10, 15, 21, 28, 36, 45}

>>> a_set

{1, 3, 36, 6, 10, 45, 15, 21, 28}

>>> a_set.discard(10)                        ①

>>> a_set

{1, 3, 36, 6, 45, 15, 21, 28}

>>> a_set.discard(10)                        ②

>>> a_set

{1, 3, 36, 6, 45, 15, 21, 28}

>>> a_set.remove(21)                         ③

>>> a_set

{1, 3, 36, 6, 45, 15, 28}

>>> a_set.remove(21)                         ④

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

KeyError: 21

#区别在于:如果该值不在集合中,remove() 方法引发一个 KeyError 例外

8.混合字典 

SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],

            1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}

>>> SUFFIXES[1024]     ④

['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']

>>> SUFFIXES[1000][3]  ⑤ #

'TB'

9.文件路径操作

>>> import os

>>> print(os.getcwd()) #当前工作路径

D:\study\workspace\pythonTest\src

>>> print(os.path.expanduser('~')) #$home路径

C:\Documents and Settings\yfzhou

>>> print(os.path.join(os.path.expanduser('~'),'hello','world','python.py')) #构建动态的文件夹和文件

... 

C:\Documents and Settings\yfzhou\hello\world\python.py

10. 罗列目录下的文件

>>> os.chdir('/Users/pilgrim/diveintopython3/') #改变当前路径

>>> import glob

>>> glob.glob('examples/*.xml')  #返回匹配的文件

['examples\\feed-broken.xml',

'examples\\feed-ns0.xml',

'examples\\feed.xml']

>>> os.chdir('examples/')  #改变路径

>>> glob.glob('*test*.py')  #返回匹配的通配符文件

['alphameticstest.py',

'pluraltest1.py'

]

11.文件元信息

>>> metadata = os.stat('roman.py') #用os.stat() 函数返回一个包含多种文件元信息的对象

>>> metadata.st_mtime

1373272096.4869184

>>> import time

>>> time.localtime(metadata.st_mtime)

time.struct_time(tm_year=2013, tm_mon=7, tm_mday=8, tm_hour=16, tm_min=28, tm_sec=16, tm_wday=0, tm_yday=189, tm_isdst=0) #可读性更强

>>> metadata.st_size #文件大小

2546

>>> print(os.path.realpath('roman.py')) #文件绝对路径

D:\study\workspace\pythonTest\src\roman.py

12.字典键值互换

>>> a_dict = {'a': 1, 'b': 2, 'c': 3}

>>> {value:key for key, value in a_dict.items()}

{1: 'a', 2: 'b', 3: 'c'}

 13. __str__ and __repr__

  • __str__ is tried first for the print operation and the str built-in function (the internal

equivalent of which print runs). It generally should return a user-friendly
display.

  • __repr__ is used in all other contexts: for interactive echoes, the repr function, and

nested appearances, as well as by print and str if no __str__ is present. It should
generally return an as-code string that could be used to re-create the object, or a
detailed display for developers

>>> class addboth(adder):

... def __str__(self):

... return '[Value: %s]' % self.data # User-friendly string

... def __repr__(self):

... return 'addboth(%s)' % self.data # As-code string

...

>>> x = addboth(4)

>>> x + 1

>>> x # Runs __repr__

addboth(5)

>>> print(x) # Runs __str__

[Value: 5]

>>> str(x), repr(x)

('[Value: 5]', 'addboth(5)')

Two usage notes:

1.keep in mind that __str__ and__repr__ must both return strings

2.depending on a container’s string-conversion logic, the user-friendly display of __str__ might only applywhen objects appear at the top level of a print operation; objects nested in larger objects might still print with their __repr__ or its default

>>> class Printer:

... def __init__(self, val):

... self.val = val

... def __str__(self): # Used for instance itself

... return str(self.val) # Convert to a string result

...

>>> objs = [Printer(2), Printer(3)]

>>> for x in objs: print(x) # __str__ run when instance printed

... # But not when instance in a list!

2

3

>>> print(objs)

[<__main__.Printer object at 0x025D06F0>, <__main__.Printer object at ...more...

>>> objs

[<__main__.Printer object at 0x025D06F0>, <__main__.Printer object at ...more...



----------------------------

>>> class Printer:

... def __init__(self, val):

... self.val = val

... def __repr__(self): # __repr__ used by print if no __str__

... return str(self.val) # __repr__ used if echoed or nested

...

>>> objs = [Printer(2), Printer(3)]

>>> for x in objs: print(x) # No __str__: runs __repr__

...

23

>>> print(objs) # Runs __repr__, not ___str__

[2, 3]

>>> objs

[2, 3]

 

你可能感兴趣的:(python)