欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

手把手教你学python3第二讲

程序员文章站 2022-03-12 17:56:29
...

首先要在这补充上一讲没有说的几个地方。有一点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

手把手教你学python3第二讲

手把手教你学python3第二讲

举个例子

>>> 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'

手把手教你学python3第二讲

手把手教你学python3第二讲

举例

>>> "%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语言格式差不多,只是把逗号换成了百分号。

手把手教你学python3第二讲

例子

>>> print('\tab')
	ab

手把手教你学python3第二讲

下面再介绍几个内置函数

>>> 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的优势。