python笔记(2)

in

>>> "a" in str1
True
>>> "de" in str1
False
>>> "de" in str2
True

in用来判断某个字符串是不是在另外一个字符串内,或者说判断某个字符串内是否包含某个字符串,如果包含,就返回True,否则返回False。

最值

>>> max(str1)
'd'
>>> max(str2)
'e'
>>> min(str1)
'a'

一个字符串中,每个字符在计算机内都是有编码的,也就是对应着一个数字,min()和max()就是根据这个数字里获得最小值和最大值,然后对应出相应的字符。关于这种编号是多少,看官可以google有关字符编码,或者ASCII编码什么的,很容易查到。

在字符串中,有一个符号:%s,就是一个占位符,这个占位符可以被其它的字符串代替。比如:
>>> "I like %s" % "python"
'I like python'
>>> "I like %s" % "Pascal"
'I like Pascal'
这是较为常用的一种字符串输出方式。

另外,不同的占位符,会表示那个位置应该被不同类型的对象填充。下面列出许多,供参考。不过,不用记忆,常用的只有%s和%d,或者再加上%f,其它的如果需要了,到这里来查即可。

占位符 说明
%s 字符串(采用str()的显示)
%r 字符串(采用repr()的显示)
%c 单个字符
%b 二进制整数
%d 十进制整数
%i 十进制整数
%o 八进制整数
%x 十六进制整数
%e 指数 (基底写为e)
%E 指数 (基底写为E)
%f 浮点数
%F 浮点数,与上相同
%g 指数(e)或浮点数 (根据显示长度)
%G 指数(E)或浮点数 (根据显示长度)
看例子:
>>> a = "%d years" % 15
>>> print a
15 years
当然,还可以在一个字符串中设置多个占位符,就像下面一样
>>> print "Suzhou is more than %d years. %s lives in here." % (2500, "qiwsir")
Suzhou is more than 2500 years. qiwsir lives in here.
对于浮点数字的打印输出,还可以限定输出的小数位数和其它样式。

>>> print "Today's temperature is %.2f" % 12.235
Today's temperature is 12.23
>>> print "Today's temperature is %+.2f" % 12.235
Today's temperature is +12.23
注意,上面的例子中,没有实现四舍五入的操作,貌似只是截取。其实,我在这里用的那个12.235的确有点特殊化了。你不妨修改为别的数,试一试,看看是不是四舍五入了。至于这个数的特殊性,如果你不能理解,就请回头找一找本教程中关于十进制与二进制数转换的讲述。

关于类似的操作,还有很多变化,比如输出格式要宽度是多少等等。如果看官在编程中遇到了,可以到网上查找。

其实,上面这种格式化方法,常常被认为是太“古老”了。因为在python中还有新的格式化方法。
>>> s1 = "I like {0}".format("python")
>>> s1
'I like python'
>>> s2 = "Suzhou is more than {0} years. {1} lives in here.".format(2500, "qiwsir")
>>> s2
'Suzhou is more than 2500 years. qiwsir lives in here.'
这就是python非常提倡的string.format()的格式化方法,其中{索引值}作为占位符,

这种方法真的是非常好,而且非常简单,只需要将对应的东西,按照顺序在format后面的括号中排列好,分别对应占位符{}即可。我喜欢的方法。

如果你觉得还不明确,还可以这样来做。

>>> print "Suzhou is more than {year} years. {name} lives in here.".format(year=2500, name="qiwsir")
Suzhou is more than 2500 years. qiwsir lives in here.
真的很简洁,看成优雅。
其实,还有一种格式化的方法,被称为“字典格式化”,这里仅仅列一个例子,如果看官要了解字典的含义,本教程后续会有的。
>>> lang = "python"
>>> print "I love %(program)s"%{"program":lang}
I love python
列举了三种基本格式化的方法,你喜欢那种?我推荐:string.format()

常用的字符串方法

字符串的方法很多。可以通过dir来查看:
>>> dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

这里举例一个:
>>> "python".isalpha() #字符串全是字母,应该返回True
True
>>> "2python".isalpha() #字符串含非字母,返回False
False

split
这个函数的作用是将字符串根据某个分割符进行分割。
>>> a = "I LOVE PYTHON"
>>> a.split(" ")
['I', 'LOVE', 'PYTHON']
这是用空格作为分割,得到了一个名字叫做列表(list)的返回值,关于列表的内容,后续会介绍。还能用别的分隔吗?
>>> b = "www.itdiffer.com"
>>> b.split(".")
['www', 'itdiffer', 'com']
去掉字符串两头的空格

这个功能,在让用户输入一些信息的时候非常有用。有的朋友喜欢输入结束的时候敲击空格,比如让他输入自己的名字,输完了,他来个空格。有的则喜欢先加一个空格,总做的输入的第一个字前面应该空两个格。

这些空格是没用的。python考虑到有不少人可能有这个习惯,因此就帮助程序员把这些空格去掉。

方法是:

S.strip() 去掉字符串的左右空格
S.lstrip() 去掉字符串的左边空格
S.rstrip() 去掉字符串的右边空格
例如:

>>> b=" hello " #两边有空格
>>> b.strip()
'hello'
>>> b
' hello '
特别注意,原来的值没有变化,而是新返回了一个结果。

>>> b.lstrip() #去掉左边的空格
'hello '
>>> b.rstrip() #去掉右边的空格
' hello'
字符大小写的转换

对于英文,有时候要用到大小写转换。最有名驼峰命名,里面就有一些大写和小写的参合。如果有兴趣,可以来这里看自动将字符串转化为驼峰命名形式的方法。

在python中有下面一堆内建函数,用来实现各种类型的大小写转化

S.upper() #S中的字母大写
S.lower() #S中的字母小写
S.capitalize() #首字母大写
S.isupper() #S中的字母是否全是大写
S.islower() #S中的字母是否全是小写
S.istitle() #S中字符串中所有的单词拼写首字母是否为大写,且其他字母为小写
看例子:

>>> a = "qiwsir,python"
>>> a.upper() #将小写字母完全变成大写字母
'QIWSIR,PYTHON'
>>> a #原数据对象并没有改变
'qiwsir,python'
>>> b = a.upper()
>>> b
'QIWSIR,PYTHON'
>>> c = b.lower() #将所有的小写字母变成大写字母
>>> c
'qiwsir,python'

>>> a
'qiwsir,python'
>>> a.capitalize() #把字符串的第一个字母变成大写
'Qiwsir,python'
>>> a #原数据对象没有改变
'qiwsir,python'
>>> b = a.capitalize() #新建立了一个
>>> b
'Qiwsir,python'

>>> a = "qiwsir,github" #这里的问题就是网友白羽毛指出的,非常感谢他。
>>> a.istitle()
False
>>> a = "QIWSIR" #当全是大写的时候,返回False
>>> a.istitle()
False
>>> a = "qIWSIR"
>>> a.istitle()
False
>>> a = "Qiwsir,github" #如果这样,也返回False
>>> a.istitle()
False
>>> a = "Qiwsir" #这样是True
>>> a.istitle()
True
>>> a = 'Qiwsir,Github' #这样也是True
>>> a.istitle()
True

>>> a = "Qiwsir"
>>> a.isupper()
False
>>> a.upper().isupper()
True
>>> a.islower()
False
>>> a.lower().islower()
True
顺着白羽毛网友指出的,再探究一下,可以这么做:

>>> a = "This is a Book"
>>> a.istitle()
False
>>> b = a.title() #这样就把所有单词的第一个字母转化为大写
>>> b
'This Is A Book'
>>> b.istitle() #判断每个单词的第一个字母是否为大写
True
join拼接字符串

用“+”能够拼接字符串,但不是什么情况下都能够如愿的。比如,将列表(关于列表,后续详细说,它是另外一种类型)中的每个字符(串)元素拼接成一个字符串,并且用某个符号连接,如果用“+”,就比较麻烦了(是能够实现的,麻烦)。

用字符串的join就比较容易实现。

>>> b
'www.itdiffer.com'
>>> c = b.split(".")
>>> c
['www', 'itdiffer', 'com']
>>> ".".join(c)
'www.itdiffer.com'
>>> "*".join(c)
'www*itdiffer*com'

在list中,也有类似的操作。只不过是以元素为单位,不是以字符为单位进行索引了。看例子就明白了。

>>> a
['2', 3, 'qiwsir.github.io']
>>> a[0] #索引序号也是从0开始
'2'
>>> a[1]
3
>>> [2]
[2]
>>> a[:2] #跟str中的类似,切片的范围是:包含开始位置,到结束位置之前
['2', 3] #不包含结束位置
>>> a[1:]
[3, 'qiwsir.github.io']
>>> a[2][7:13] #可以对列表元素做2次切片
'github'

list和str两种类型的数据,有共同的地方,它们都属于序列(都是一些对象按照某个次序排列起来,这就是序列的最大特征),因此,就有很多类似的地方。如刚才演示的索引和切片,是非常一致的。

>>> lang = "python"
>>> lang.index("y")
1
>>> lst = ['python','java','c++']
>>> lst.index('java')
1
在前面讲述字符串索引和切片的时候,以及前面的演示,所有的索引都是从左边开始编号,第一个是0,然后依次增加1。此外,还有一种编号方式,就是从右边开始,右边第一个可以编号为-1,然后向左依次是:-2,-3,…,依次类推下来。这对字符串、列表等各种序列类型都是用。

>>> lang
'python'
>>> lang[-1]
'n'
>>> lst
['python', 'java', 'c++']
>>> lst[-1]
'c++'
从右边开始编号,第-1号是右边第一个。但是,如果要切片的话,应该注意了。

>>> lang[-1:-3]
''
>>> lang[-3:-1]
'ho'
>>> lst[-3:-1]
['python', 'java']
序列的切片,一定要左边的数字小于右边的数字,lang[-1:-3]就没有遵守这个规则,返回的是一个空。

反转

这个功能作为一个独立的项目提出来,是因为在编程中常常会用到。通过举例来说明反转的方法:

>>> alst = [1,2,3,4,5,6]
>>> alst[::-1] #反转
[6, 5, 4, 3, 2, 1]
>>> alst
[1, 2, 3, 4, 5, 6]
当然,对于字符串也可以

>>> lang
'python'
>>> lang[::-1]
'nohtyp'
>>> lang
'python'
看官是否注意到,上述不管是str还是lst反转之后,再看原来的值,没有改变。这就说明,这里的反转,不是在“原地”把原来的值倒过来,而是新生成了一个值,那个值跟原来的值相比,是倒过来了。

这是一种非常简单的方法,虽然我在写程序的时候常常使用,但是,我不是十分推荐,因为有时候让人感觉迷茫。python还有另外一种方法让list反转,是比较容易理解和阅读的,特别推荐之:

>>> list(reversed(alst))
[6, 5, 4, 3, 2, 1]
比较简单,而且很容易看懂。不是吗?

顺便给出reversed函数的详细说明:

>>> help(reversed)

Help on class reversed in module __builtin__:

class reversed(object)
 |  reversed(sequence) -> reverse iterator over values of the sequence
 |  
 |  Return a reverse iterator

它返回一个可以迭代的对象(关于迭代的问题,后续会详述之),不过是已经将原来的序列对象反转了。比如:

>>> list(reversed("abcd"))
['d', 'c', 'b', 'a']
很好,很强大,特别推荐使用。

对list的操作

任何一个行业都有自己的行话,如同古代的强盗,把撤退称之为“扯乎”一样,纵然是一个含义,但是强盗们愿意用他们自己的行业用语,俗称“黑话”。各行各业都如此。这样做的目的我理解有两个,一个是某种保密;另外一个是行外人士显示本行业的门槛,让别人感觉这个行业很高深,从业者有一定水平。

不管怎么,在python和很多高级语言中,都给本来数学角度就是函数的东西,又在不同情况下有不同的称呼,如方法、类等。当然,这种称呼,其实也是为了区分函数的不同功能。

前面在对str进行操作的时候,有一些内置函数,比如s.strip(),这是去掉左右空格的内置函数,也是str的方法。按照一贯制的对称法则,对list也会有一些操作方法。

在讲述字符串的时候,提到过,所有的序列,都有几种基本操作。list当然如此。

基本操作

len()
在交互模式中操作:

>>> lst
['python', 'java', 'c++']
>>> len(lst)
3
+,连接两个序列
交互模式中:

>>> lst
['python', 'java', 'c++']
>>> alst
[1, 2, 3, 4, 5, 6]
>>> lst + alst
['python', 'java', 'c++', 1, 2, 3, 4, 5, 6]
*,重复元素
交互模式中操作

>>> lst
['python', 'java', 'c++']
>>> lst * 3
['python', 'java', 'c++', 'python', 'java', 'c++', 'python', 'java', 'c++']
in
列表lst还是前面的值

>>> "python" in lst
True
>>> "c#" in lst
False
max()和min()
以int类型元素为例。如果不是,都是按照字符在ascii编码中所对应的数字进行比较的。

>>> alst
[1, 2, 3, 4, 5, 6]
>>> max(alst)
6
>>> min(alst)
1
>>> max(lst)
'python'
>>> min(lst)
'c++'
cmp()
采用上面的方法,进行比较

>>> lsta = [2,3]
>>> lstb = [2,4]
>>> cmp(lsta,lstb)
-1
>>> lstc = [2]
>>> cmp(lsta,lstc)
1
>>> lstd = ['2','3']
>>> cmp(lsta,lstd)
-1
追加元素

>>> a = ["good","python","I"]
>>> a
['good', 'python', 'I']
>>> a.append("like") #向list中添加str类型"like"
>>> a
['good', 'python', 'I', 'like']
>>> a.append(100) #向list中添加int类型100
>>> a
['good', 'python', 'I', 'like', 100]
官方文档这样描述list.append()方法

list.append(x)

Add an item to the end of the list; equivalent to a[len(a):] = [x].

从以上描述中,以及本部分的标题“追加元素”,是不是能够理解list.append(x)的含义呢?即将新的元素x追加到list的尾部。

列位看官,如果您注意看上面官方文档中的那句话,应该注意到,还有后面半句: equivalent to a[len(a):] = [x],意思是说list.append(x)等效于:a[len(a):]=[x]。这也相当于告诉我们了另外一种追加元素的方法,并且两种方法等效。

>>> a
['good', 'python', 'I', 'like', 100]
>>> a[len(a):]=[3] #len(a),即得到list的长度,这个长度是指list中的元素个数。
>>> a
['good', 'python', 'I', 'like', 100, 3]
>>> len(a)
6
>>> a[6:]=['xxoo']
>>> a
['good', 'python', 'I', 'like', 100, 3, 'xxoo']

分别用list()和tuple()能够实现两者的转化:

>>> t
(1, '23', [123, 'abc'], ('python', 'learn'))
>>> tls = list(t) #tuple-->list
>>> tls
[1, '23', [123, 'abc'], ('python', 'learn')]

>>> t_tuple = tuple(tls) #list-->tuple
>>> t_tuple
(1, '23', [123, 'abc'], ('python', 'learn'))
tuple用在哪里?

既然它是list和str的杂合,它有什么用途呢?不是用list和str都可以了吗?

在很多时候,的确是用list和str都可以了。但是,看官不要忘记,我们用计算机语言解决的问题不都是简单问题,就如同我们的自然语言一样,虽然有的词汇看似可有可无,用别的也能替换之,但是我们依然需要在某些情况下使用它们.

一般认为,tuple有这类特点,并且也是它使用的情景:

Tuple 比 list 操作速度快。如果您定义了一个值的常量集,并且唯一要用它做的是不断地遍历它,请使用 tuple 代替 list。
如果对不需要修改的数据进行 “写保护”,可以使代码更安全。使用 tuple 而不是 list 如同拥有一个隐含的 assert 语句,说明这一数据是常量。如果必须要改变这些值,则需要执行 tuple 到 list 的转换 (需要使用一个特殊的函数)。
Tuples 可以在 dictionary(字典,后面要讲述) 中被用做 key,但是 list 不行。Dictionary key 必须是不可变的。Tuple 本身是不可改变的,但是如果您有一个 list 的 tuple,那就认为是可变的了,用做 dictionary key 就是不安全的。只有字符串、整数或其它对 dictionary 安全的 tuple 才可以用作 dictionary key。
Tuples 可以用在字符串格式化中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值