手把手教你学python3第二讲
首先要在这补充上一讲没有说的几个地方。有一点python和matlab一样,不需要像c语言预先给变量定义类型才能赋值。python和matlab一样按Ctrl+C停止程序执行。
>>> a=[1,2,3]
>>> len(a)
3
>>> a.index(2)
1
>>> del a[:]
>>> a
[]
>>> del a
>>> a
Traceback (most recent call last):
File "<pyshell#230>", line 1, in <module>
a
NameError: name 'a' is not defined
>>>
a.index可以返回列表里元素的下标
len可以求长度,但是数字是没有长度的,字符串是有的。
>>> len(320)
Traceback (most recent call last):
File "<pyshell#231>", line 1, in <module>
len(320)
TypeError: object of type 'int' has no len()
>>> len('lcl')
3
>>>
del a[:]是删除列表里所有元素,a变成一个空列表。而del a则是删除列表,一般不用,因为python自己会检查如果这个变量没有标签,会自动删除的。
>>> a=[1,2]
>>> b=a[:]
>>> del a[:]
>>> a
[]
>>> b
[1, 2]
>>> a=[1,2]
>>> b=a.copy()
>>> del a[:]
>>> a
[]
>>> b
[1, 2]
b=a[:]和b=a.copy()都代表复制了一个新的列表。
下面学习元组
元组内容是不能改变的,建立一个元组一般也就是把列表的中括号改为小括号
>>> a=1,2,3
>>> type(a)
<class 'tuple'>
>>> a=(1)
>>> type(a)
<class 'int'>
>>> a=1,
>>> type(a)
<class 'tuple'>
>>> a=()
>>> type(a)
<class 'tuple'>
但是从上面可以看出来,元组可以没有括号,但是必须有逗号,定义一个空元组用括号。
元组不能改变内容,但是我们可以定义新的元组。如下
>>> a=1,2,3
>>> a[1]
2
>>> a[1]=2
Traceback (most recent call last):
File "<pyshell#283>", line 1, in <module>
a[1]=2
TypeError: 'tuple' object does not support item assignment
>>> a=a[:]+4
Traceback (most recent call last):
File "<pyshell#284>", line 1, in <module>
a=a[:]+4
TypeError: can only concatenate tuple (not "int") to tuple
>>> a=a[:]+(4)
Traceback (most recent call last):
File "<pyshell#285>", line 1, in <module>
a=a[:]+(4)
TypeError: can only concatenate tuple (not "int") to tuple
>>> a=a[:]+(4,)
>>> a
(1, 2, 3, 4)
元组有很多bif都没办法用。>>> a=1,2,3
>>> a
(1, 2, 3)
>>> a.sort()
Traceback (most recent call last):
File "<pyshell#260>", line 1, in <module>
a.sort()
AttributeError: 'tuple' object has no attribute 'sort'
>>> a.reverse()
Traceback (most recent call last):
File "<pyshell#261>", line 1, in <module>
a.reverse()
AttributeError: 'tuple' object has no attribute 'reverse'
>>> a.count(1)
1
>>> a.index(2)
1
>>> a.clear()
Traceback (most recent call last):
File "<pyshell#264>", line 1, in <module>
a.clear()
AttributeError: 'tuple' object has no attribute 'clear'
>>> a.copy()
Traceback (most recent call last):
File "<pyshell#265>", line 1, in <module>
a.copy()
AttributeError: 'tuple' object has no attribute 'copy'
>>> del a
看到只有count和index能用。del也可以用,但是下面就会报错
>>> del a[:]
Traceback (most recent call last):
File "<pyshell#269>", line 1, in <module>
del a[:]
TypeError: 'tuple' object does not support item deletion
列表有列表推导式,那么元组呢?
>>> a =(x**2 for x in range(10))
>>> a
<generator object <genexpr> at 0x000002492C925468>
>>> type(a)
<class 'generator'>
>>> a.next
Traceback (most recent call last):
File "<pyshell#291>", line 1, in <module>
a.next
AttributeError: 'generator' object has no attribute 'next'
>>> a.__next__()
0
>>> a.__next__()
1
>>> a.__next__()
4
>>> a =[x**2 for x in range(10)]
>>> type(a)
<class 'list'>
上面误打误撞生成了一个generator
字符串再学习
pyhon里没有c语言里的char类型,实际上char就是长度为1的string。
字符串和列表元组一样是个序列。
>>> a='123456789'
>>> a[2]='2'
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
a[2]='2'
TypeError: 'str' object does not support item assignment
>>>
还可以隔固定个字符来取
>>> a[::4]
'159'
这种取法对序列都适用
>>> a=[1,2,3,4,5,6]
>>> a[::2]
[1, 3, 5]
下面是常用的bif
举个例子
>>> a='abc'
>>> a.capitalize()
'Abc'
我们可以用下面代码来设计一个密码修改检查器,必须输入十位以上并且包含数字,大写字母,小写字母的密码才能通过
pas=input('请输入密码:')
l=len(pas)
while not (l>=10 and not pas.islower() and not pas.isupper() and pas.isalnum() and not pas.isalpha() and not pas.isdigit()):
pas=input('重新输入密码:')
l=len(pas)
print('密码设置成功')
当然如果你对in函数用的很熟,可能有下面的代码
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'
passwd = input('请输入需要检查的密码组合:')
length = len(passwd)
while (passwd.isspace() or length == 0) :
passwd = input("您输入的密码为空(或空格),请重新输入:")
if length <= 8:
flag_len = 1
elif 8 < length < 16:
flag_len = 2
else:
flag_len = 3
flag_con = 0
for each in passwd:
if each in chars:
flag_con += 1
break
for each in passwd:
if each in nums:
flag_con += 1
break
while 1 :
print("您的密码安全级别评定为:", end='')
if flag_len == 1 or flag_con == 1 :
print("低")
elif flag_len == 2 or flag_con == 2 :
print("中")
else :
print("高")
print("请继续保持")
break
print("请按以下方式提升您的密码安全级别:\n\
\t1. 密码必须由数字、字母及特殊字符三种组合\n\
\t2. 密码只能由字母开头\n\
\t3. 密码长度不能低于16位'")
break
学好python里in这个函数是很重要的。有关负数索引
>>> a='123'
>>> a[-1]
'3'
>>> a[-2;-1]
SyntaxError: invalid character in identifier
>>> a[-2:-1]
'2'
>>> a[-3]
'1'
>>> a[-4]
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
a[-4]
IndexError: string index out of range
>>> a[-3:0]
''
>>> a[-3:-1]
'12'
>>> a[-3:2]
'12'
>>>
负数只是从右向左数而已,不是很难。
字符串格式化
有三种,第一种是位置参数
>>> "{0} love {1},{2}".format('i','you','china')
'i love you,china'
第二种是关键字参数
>>> "{a} love {b},{c}".format(a='i',b='you',c='china')
'i love you,china'
还可以混合,但是位置参数要在前
>>> "{0} love {b},{c}".format('i',b='you',c='china')
'i love you,china'
>>> "{a} love {1},{c}".format(a='i','you',c='china')
SyntaxError: positional argument follows keyword argument
如果要打印{0}
>>> "{{0}} love {b},{c}".format('i',b='you',c='china')
'{0} love you,china'
字母也可以只需要加一对大括号
>>> "{{a}} love {b},{c}".format(a='i',b='you',c='china')
'{a} love you,china'
但是这样format对应的那个就没用了,但是不会错位的,也就是说位置和关键字参数还有用,只是format括号里没用了
>>> "{{0}} love {1},{2}".format('i','you','china')
'{0} love you,china'
举例
>>> "%d" % 4
'4'
>>> '%4.2f' % 3.1415926
'3.14'
>>> '%10.2f' % 3.1415926
' 3.14'
>>> '%-10.2f' % 3.1415926
'3.14 '
>>> '%+10.2f' % 3.1415926
' +3.14'
>>> '%+10.2e' % 3.1415926
' +3.14e+00'
>>> '%+10.2e' % -3.1415926
' -3.14e+00'
>>> '%10.2e' % -3.1415926
' -3.14e+00'
>>> '%10.2E' % -3.1415926
' -3.14E+00'
>>> '%10.2G' % -3.1415926
' -3.1'
>>> "%o" % 10
'12'
>>> "%x" % 10
'a'
>>> "%X" % 10
'A'
>>> "%.2X" % 10
'0A'
>>> "%10.2X" % 10
' 0A'
>>> "%-10.2X" % 10
'0A '
>>> "%#-10.2X" % 10
'0X0A '
>>> "%#-10.2o" % 10
'0o12 '
>>> '%c' % 97
'a'
>>> '%4.c' % 97
' a'
>>> '%-4.c' % 97
'a '
>>> '%-4.2c' % 97
'a '
>>> '%04.c' % 97
' a'
>>> "%010.2X" % 10
'000000000A
当然还可以混合使用
>>> '{0:.2f} {1}'.format(3.145,5)
'3.15 5'
>>> '{0.2f} {1}'.format(3.145,5)
Traceback (most recent call last):
File "<pyshell#38>", line 1, in <module>
'{0.2f} {1}'.format(3.145,5)
AttributeError: 'float' object has no attribute '2f'
分号后面是格式,可以说分号代替了百分号
>>> '{0:-2x} {1}'.format(16,5)
'10 5'
>>> '{0:-10x} {1}'.format(16,5)
' 10 5'
>>> '{0:-010x} {1}'.format(16,5)
'0000000010 5'
这么做有什么意义呢?
>>> a='{0} {1}'
>>> a.format(3,4)
'3 4'
>>> a.format('3','4')
'3 4'
如果你要批量替换还是有意义的。
我们还可以把它打印出来。
>>> print("%d" % 34)
34
和c语言格式差不多,只是把逗号换成了百分号。例子
>>> print('\tab')
ab
下面再介绍几个内置函数
>>> a=[1,2,3]
>>> b=tuple(a)
>>> b
(1, 2, 3)
>>> str(a)
'[1, 2, 3]'
>>> c=str(a)_
SyntaxError: invalid syntax
>>> c=str(a)
>>> c
'[1, 2, 3]'
>>> c[0]
'['
>>> b[0]
1
>>> d=1,2,3
>>> str(d)
'(1, 2, 3)'
>>> str(d)[0]
'('
str转换是有问题的。它连括号都算一个元素。
>>> sorted(a)
[1, 2, 3]
>>> a
[1, 2, 3]
>>> reversed(a)
<list_reverseiterator object at 0x00000208CA04FCF8>
>>> list(reversed(a))
[3, 2, 1]
>>> a
[1, 2, 3]
>>> a.reverse()
>>> a
[3, 2, 1]
>>> max(a)
3
>>> max(a,6)
Traceback (most recent call last):
File "<pyshell#37>", line 1, in <module>
max(a,6)
TypeError: unorderable types: int() > list()
>>> min(a)
1
>>> a.index(1)
2
>>> sum(a)
6
>>> sum(a,3)
9
>>> max('abcdefgh')
'h'
>>> max("abcd3")
'd'
>>> max(2,'2')
Traceback (most recent call last):
File "<pyshell#44>", line 1, in <module>
max(2,'2')
TypeError: unorderable types: str() > int()
>>> sum("ascd")
Traceback (most recent call last):
File "<pyshell#45>", line 1, in <module>
sum("ascd")
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> enumerate(a)
<enumerate object at 0x00000208CA04DC18>
>>> list(enumerate(a))
[(0, 3), (1, 2), (2, 1)]
>>> b=['2','3','4']
>>> list(zip(a,b))
[(3, '2'), (2, '3'), (1, '4')]
>>> a
[3, 2, 1]
>>> a=[1,2,3,4]
>>> list(zip(a,b))
[(1, '2'), (2, '3'), (3, '4')]
sorted和reverse可以对元组和字符串操作,因为它不会改变原来序列的内容,而是s.sort()和s.reverse()会改变原来列表的内容。
max和min分别求序列的最大最小值,如果是字符则求ASCII码的最大值,要求出他的索引只能再加一句,s.index(),.没有matlab那么方便,[a,b]=max(c)是可以直接返回最大值和对应的索引。
>>> a="刘成林"
>>> max(a)
'林'
还能求汉字序列和混合的
>>> a="了2"
>>> max(a)
'了
python里用的是一种可以兼容汉字的编码uf-8。
sum可以有两个参数,第二个参数可以设置start值,它只能对数字加,不然会报错。
enumerate作用是把元素和索引打包成一个元组。
zip是匹配两个序列里索引一样的元素,并打包,也可以序列种类不同。
>>> a=[1,2,3]
>>> b=2,3,4,5
>>> zip(a,b)
<zip object at 0x00000208CA03FF48>
>>> tuple(zip(a,b))
((1, 2), (2, 3), (3, 4))
笔者要再强调一下in的作用
name = input('请输入待查找的用户名:')
score = [['a', 85], ['b', 80], ['c', 65], ['d', 95], ['e', 90]]
IsFind = False
for each in score:
if name in each:
print(name + '的得分是:', each[1])
IsFind = True
break
if IsFind == False
print('查找的数据不存在!')
灵活运用in才能发挥python的优势。