Python核心编程第六章笔记

成员关系操作符(in,not in)

equence1+ sequence2

该表达式的结果是一个包含sequence1sequence2的内容的新序列.注意,这种方式看

起来似乎实现了把两个序列内容合并的概念,但是这个操作不是最快或者说最有效的。



>>>

>>>

>>>

...

...

abc

s= 'abcde'

i= -1

fori in range(-1, -len(s), -1):

prints[:i]

abcd

ab

a



None作为索引值,这样一来就可以满足你的需要,如说,在你想用一个变量作为索引来从第一个到遍历最后一个元素的时候:

>>>s = 'abcde'

>>>for i in [None] + range(-1, -len(s), -1):

...print s[:i]

...

abcde

abcd

abc

ab

a


似乎还可以先创建一个只包含None的列表,然后用extend()函数把range()的输出添加到这个列表,或者先建立range()输出组成的列表然后再把None插入到这个列表的最前面,然后对这个列表进行遍历,

但是可变对象的内建函数extend()根本就没有返回值,所以这个方法是行不通的。

>>>for i in [None].extend(range(-1, -len(s), -1)):

...print s[:i]

...

Traceback(most recent call last):

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

TypeError:iteration over non-sequence


>>>s = str(range(4)) # 把一个列表转换成一个字符串

>>>s

'[0,1, 2, 3]'



如何改变字符串

>>aString = aString[:6] + 'Python!'

>>>aString

'HelloPython!'



如何删除字符和字符串

>>>aString = 'Hello World!'

>>>aString = aString[:3] + aString[4:]

>>>aString

'HeloWorld!'



连接符(+ )运行时刻字符串连接

>>>'Spanish' + 'Inquisition'

'SpanishInquisition'

编译时字符串连接

>>>foo = "Hello" 'world!'

>>>foo

'Helloworld!'


>>>

...

...

...

f= urllib.urlopen('http://' # protocol

'localhost'# hostname

':8000'# port

'/cgi-bin/friends2.py')# file


原始字符串操作符(r/R )

>>>'\n'

'\n'

>>>print '\n'

>>>r'\n'

'\\n'

>>>print r'\n'

\n


>>>f = open('C:\windows\temp\readme.txt', 'r')

Traceback(most recent call last):

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

f= open('C:\windows\temp\readme.txt', 'r')

IOError:[Errno 2] No such file or directory: 'C:\\win-dows\\temp\readme.txt'

>>>f = open(r'C:\windows\temp\readme.txt', 'r')

>>>f.readline()

'Tableof Contents (please check timestamps for last update!)\n'

>>>f.close()



>>>import re

>>>m = re.search('\\[rtfvn]', r'Hello World!\n')

>>>if m is not None: m.group()

...

>>>m = re.search(r'\\[rtfvn]', r'Hello World!\n')

>>>if m is not None: m.group()

...

'\\n'



enumerate()函数

>>>s = 'foobar'

>>>for i, t in enumerate(s):

...

printi, t


zip()函数

>>>s, t = 'foa', 'obr'

>>>zip(s, t)

[('f','o'), ('o', 'b'), ('a', 'r')]



方法

string.capitalize()

把字符串的第一个字符大写


string.center(width)

返回一个原字符串居中,并使用空格填充至长度width的新字符


string.count(str,beg=0,end=len(string))

返回strstring里面出现的次数,如果beg或者 end指定则

返回指定范围内str出现的次数

string.decode(encoding='UTF-8',errors='strict')

encoding指定的编码格式解码string,如果出错默认报一个

ValueError的 异 常,除 非errors指 定 的是 'ignore'或 者

'replace'


string.encode(encoding='UTF-8',errors='strict')encoding指定的编码格式编码string,如果出错默认报一个ValueError的异常,除非errors指定的是'ignore'或者'replace'



string.endswith(obj,beg=0,end=len(string))检查字符串是否以obj结束,如果beg或者 end指定则检查指定的范围内是否以obj结束,如果是,返回True,否则返回False.


string.expandtabs(tabsize=8)把字符串string中的 tab符号转为空格,

默认的空格数tabsize8.


string.find(str,beg=0,end=len(string))

检测str是否包含在string,如果begend指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1



string.index(str,beg=0,end=len(string))

find()方法一样,只不过如果str不在string中会报一个异常.


string.isalnum()

如果string至少有一个字符并且所有字符都是字母或数字则返True,否则返回False


string.isalpha()

如果string至少有一个字符并且所有字符都是字母则返回True,否则返回False


string.isdecimal()如果string只包含十进制数字则返回True否则返回False.


string.isdigit()如果string只包含数字则返回True否则返回False.


string.islower()b,c 如果string中包含至少一个区分大小写的字符,并且所有这些(区分

大小写的)字符都是小写,则返回True,否则返回False


string.isnumeric()

如果string中只包含数字字符,则返回True,否则返回False


string.isspace()

如果string中只包含空格,则返回True,否则返回False.


string.istitle()

如果string是标题化的(title())则返回True,否则返回False


string.isupper()

如果string中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回True,否则返回False


string.join(seq)Merges (concatenates)

string作为分隔符,seq中所有的元素(的字符串表示)合并为一个新的字符串


string.ljust(width)

返回一个原字符串左对齐,并使用空格填充至长度width的新字符串


string.lower()

转换string中所有大写字符为小写.


string.lstrip()

截掉string左边的空格


string.partition(str)

有点像find()split()的结合体,str出现的第一个位置起,把字 符 串 string分 成 一个 3元 素 的元 组


(string_pre_str,str,string_post_str),如果string中不包含strstring_pre_str== string.


string.replace(str1,str2,num=string.count(str1))

string中的 str1替换成str2,如果num指定,则替换不超过num.


string.rfind(str,beg=0,end=len(string))

类似于find()函数,不过是从右边开始查.


string.rindex(str, beg=0,end=len(string))

类似于index(),不过是从右边开始.


string.rjust(width)

返回一个原字符串右对齐,并使用空格填充至长度width的新字符串


string.rpartition(str)

类似于partition()函数,不过是从右边开始查找.


string.rstrip()

删除string字符串末尾的空格.


string.split(str="",num=string.count(str)) str为分隔符切片string,如果num

有指定值,则仅分隔num个子字符串

string.splitlines(num=string.count('\n'))

按照行分隔,返回一个包含各行作为元素的列表,如果num指定则仅切片num.


string.startswith(obj,beg=0,end=len(string))

检查字符串是否是以obj开头,是则返回True,否则返回False。如果begend指定值,则在指定范围内检查.


string.strip([obj])

string上执行lstrip()rstrip()


string.swapcase()翻转string中的大小写


string.title()

返回"标题化"string,就是说所有单词都是以大写开始,其余字母均为小写(istitle())


string.translate(str,del="")

根据str给出的表(包含256个字符)转换string的字符,要过滤掉的字符放到del参数中


string.upper()

转换string中的小写字母为大写


string.zfill(width)

返回长度为width的字符串,原字符串string右对齐,前面填充0



>>>a = [6, 4, 5]

>>>reduce(operator.add, a)


在使用可变对象的方法如sort(),extend()reverse()的时候要注意,这些操作会在列表中原地执行操作,也就是说现有的列表内容会被改变;如果你确实需要返回一个对象,使用reversed()sorted()内建数.



所有函数返回的多对象(不包括有符号封装的)都是元组类型。

deffoo1():

:

returnobj1, obj2, obj3

拷贝Python对象浅拷贝和深拷贝

当你创建一个对象,然后把它赋给另一个变量的时候,Python并没有拷贝这个对象,而是拷贝了这个对象的引用。

序列类型对象的浅拷贝是默认类型拷贝,并可以以下几种方式实施:

(1)完全切片操作[:]

(2)利用工厂函数,比如list(),dict()

(3)使用copy模块的copy函数.

这两个列表的两个对象中,第一个对象是不可变的(是个字符串类型),而第二个是可变的(

个列表).正因为如此,当进行浅拷贝时,字符串被显式的拷贝,并新创建了一个字符串对象,而列

表元素只是把它的引用复制了一下,并不是它的成员.所以改变名字没有任何问题,但是更改他

们银行账号的任何信息都会引发问题.

BEFORE:

>>>[id(x) for x in hubby]

[9919616,11826320]

>>>[id(x) for x in wifey]

[9919616,11826320]

AFTER:

>>>[id(x)

[12092832,

>>>[id(x)

[12191712,

forx in hubby]

11826320]

forx in wifey]

11826320]



要得到一个完全拷贝或者说深拷贝--创建一个新的容器对象,包含原有对象元素(引用)全新拷贝的引用--需要copy.deepcopy()函数.

>>>newPerson = copy.deepcopy(person)

第一,非容器类型(比如数字,字符串和其他"原子"类型的对象,像代码,类型和xrange对象等)没有被拷贝一说,浅拷贝是用完全切片操作来完成的.

第二,如果元组变量只包含原子类型对象,对它的深拷贝将不会进行.如果我们把账户信息改成元组类

,那么即便按我们的要求使用深拷贝操作也只能得到一个浅拷贝

其实copy模块中只有两个函数可用:copy()进行浅拷贝操作,deepcopy()进行深拷贝操作.



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值