列表和元组 、 字典 、 集合
列表
>> > from random import randint
>> > l1 = [ randint( 1 , 100 ) for i in range ( 10 ) ]
>> > l1
[ 47 , 95 , 14 , 21 , 28 , 80 , 23 , 98 , 17 , 37 ]
>> > l1[ 0 ] = 80
>> > l1[ 2 : 4 ] = [ 10 , 50 , 20 , 80 ]
>> > l1
[ 80 , 95 , 10 , 50 , 20 , 80 , 28 , 80 , 23 , 98 , 17 , 37 ]
>> > l1. append( 80 )
>> > l1. insert( 0 , 20 )
>> > l1. extend( [ 10 , 20 , 30 ] )
>> > l1. append( [ 10 , 20 , 30 ] )
>> > l1. pop( )
>> > l1. index( 98 )
>> > l1. pop( 10 )
>> > l1. remove( 20 )
>> > l1. sort( )
>> > l1. reverse( )
>> > l1. count( 80 )
>> > l2 = l1
>> > l2
[ 95 , 80 , 80 , 80 , 80 , 50 , 37 , 30 , 28 , 23 , 20 , 20 , 17 , 10 , 10 ]
>> > while 80 in l2:
. . . l2. remove( 80 )
>> > l2
[ 95 , 50 , 37 , 30 , 28 , 23 , 20 , 20 , 17 , 10 , 10 ]
>> > l1
[ 95 , 50 , 37 , 30 , 28 , 23 , 20 , 20 , 17 , 10 , 10 ]
>> > l3 = l1. copy( )
>> > l1. clear( )
>> > l3
[ 95 , 50 , 37 , 30 , 28 , 23 , 20 , 20 , 17 , 10 , 10 ]
元组
属于容器、不可变、顺序类型 元组相当于是不可变的列表
>> > t1 = ( 10 , 20 , 30 , 20 , 100 )
>> > t1. count( 20 )
2
>> > t1. index( 30 )
2
>> > t2 = ( 10 )
>> > type ( t2)
< class 'int' >
>> > t2
10
>> > t3 = ( 10 , )
>> > type ( t3)
< class 'tuple' >
>> > t3
( 10 , )
>> > len ( t3)
1
练习1:列表模拟栈结构
stack = [ ] 首先定义一个存储数据的列表
def push_it ( ) :
data = input ( '数据:' ) . strip( ) strip去除字符串两端空格
if not data:
print ( '格式错误,请重新尝试' )
stack. append( data)
def pop_it ( ) :
def pop_it ( ) :
if [ ] == stack:
print ( '空' )
else :
print ( '从栈中弹出了% s' % stack. pop( ) )
def view_it ( ) :
print ( stack)
def menu_it ( ) :
promat = """(0)压栈
(1)出栈
(2)查询
(3)退出
请选择(0/1/2/3)"""
while 1 :
show_menu( ) :
"用于在屏幕上打印菜单,根据用户选择调用相关函数"
dic = { '0' : push_it, '1' : pop_it, '2' : view_it} 定义一个字典用来调用函数
xz = input ( promat) . strip( )
if xz not in [ '0' , '1' , '2' , '3' ] :
print ( '格式错误,请重试' )
return
if xz == '3' :
print ( 'bye' , 'bye' )
break
dic[ xz] ( ) 通过字典的key来获取value。
if __name__ == '__main__' :
menu_it( )
字典
属于容器、可变、映射类型 字典的key不能重复 通过key进行赋值时,如果key已在字典中则修改值;如果key不在字典中,则新增值 字典的key,必须是不可变类型
>> > d1 = { 'name' : 'tom' , 'name' : 'bob' }
>> > d1
{ 'name' : 'bob' }
>> > d1[ 'name' ] = 'jerry'
>> > d1
{ 'name' : 'jerry' }
>> > d1[ 'age' ] = 20
>> > d1
{ 'name' : 'jerry' , 'age' : 20 }
>> > d1[ ( 100 , 200 ) ] = 'home'
>> > d1
{ 'name' : 'jerry' , 'age' : 20 , ( 100 , 200 ) : 'home' }
>> > d1[ [ 100 , 200 ] ] = 'home'
>> > len ( d1)
3
>> > 20 in d1
False
>> > 'age' in d1
True
>> > d1[ 0 ]
>> > d2 = dict ( [ ( 'name' , 'tom' ) , ( 'qq' , '12345243' ) , ( 'email' , 'tom@tedu.cn' ) ] )
>> > d2
{ 'name' : 'tom' , 'qq' : '12345243' , 'email' : 'tom@tedu.cn' }
>> > d3 = { } . fromkeys( [ 'tom' , 'jerry' , 'bob' , 'alice' ] , 20 )
>> > d3
{ 'tom' : 20 , 'jerry' : 20 , 'bob' : 20 , 'alice' : 20 }
>> > for k in d2:
. . . print ( k, d2[ k] )
>> > d2. get( 'name' )
'tom'
>> > print ( d2. get( 'phone' ) )
None
>> > print ( d2. get( 'phone' , 'not found' ) )
not found
>> > print ( d2. get( 'email' , 'not found' ) )
tom@tedu. cn
>> > d2. keys( )
dict_keys( [ 'name' , 'qq' , 'email' ] )
>> > list ( d2. keys( ) )
[ 'name' , 'qq' , 'email' ]
>> > d2. values( )
dict_values( [ 'tom' , '12345243' , 'tom@tedu.cn' ] )
>> > list ( d2. items( ) )
[ ( 'name' , 'tom' ) , ( 'qq' , '12345243' ) , ( 'email' , 'tom@tedu.cn' ) ]
>> > d2. pop( 'qq' )
'12345243'
>> > d2. update( { 'city' : 'shenzhen' , 'age' : 20 } )
>> > d2
{ 'name' : 'tom' , 'email' : 'tom@tedu.cn' , 'city' : 'shenzhen' , 'age' : 20 }
练习2:字典使用的练习
import getpass
users = { }
def register ( ) :
user = input ( '请输入用户名:' ) . strip( )
if user in users:
print ( '\033[32m;1m用户以存在\033[0m' )
elif not user:
print ( '\033[32;1m用户名不能为空\033[0m' )
else :
password = getpass. getpass( '密码:' )
users[ user] = password
print ( '\033[32;1m注册成功\033[0m' )
def login ( ) :
username = input ( '用户名:' )
password = getpass. getpass( '密码:' )
if users. get( username) == password:
print ( '\033[32;1mLogin sussfull\033[0m' )
break
else :
print ( '\033[31;1mLogin error\033[0m' )
def show_menu ( ) :
promat = """(1)注册:
(2)登陆:
(3)退出
请选择(0/1/2):"""
funs = { '1' : register, '2' : login}
while 1 :
xz = input ( promat) . strip( )
if xz not in { '1' , '2' , '3' } :
print ( '格式错误' )
continue
if xz == '3' :
print ( 'Bye...' )
break
funs[ xz] ( )
if __name__ == '__main__' :
show_menu( )
测试运行
[ root@python day5]
( 1 ) 注册:
( 2 ) 登陆:
( 3 ) 退出
请选择( 0 / 1 / 2 ) : 1
请输入用户名: wenhao
密码: 此处不显示密码是因为调用了getpass. getpass
注册成功
( 1 ) 注册:
( 2 ) 登陆:
( 3 ) 退出
请选择( 0 / 1 / 2 ) : 2
用户名: bob
密码:
Login error
( 1 ) 注册:
( 2 ) 登陆:
( 3 ) 退出
请选择( 0 / 1 / 2 ) : 2
用户名: wenhao
密码:
Login sussfull
( 1 ) 注册:
( 2 ) 登陆:
( 3 ) 退出
请选择( 0 / 1 / 2 ) : 3
Bye. . .
集合
数学上,集合set是由不同元素构成的 集合中数据,被称作集合元素。集合元素都是不可变对象。 集合没有顺序 集合就像是一个无值的字典 集合分成可变集合set,和不可变集合frozenset
>> > s1 = { 10 , 20 , 30 , 'abc' , 'tom' , 'jerry' }
>> > type ( s1)
< class 'set' >
>> > s1
{ 10 , 'jerry' , 'abc' , 20 , 'tom' , 30 }
>> > s2 = set ( [ 10 , 20 , 30 , 40 , 50 ] )
>> > s2
{ 40 , 10 , 50 , 20 , 30 }
>> > s3 = set ( 'abc' )
>> > s4 = set ( 'bcd' )
>> > s3
{ 'c' , 'b' , 'a' }
>> > s4
{ 'd' , 'c' , 'b' }
>> > len ( s2)
5
>> > for i in s2:
. . . print ( i)
>> > 20 in s2
True
>> > 100 not in s2
True
>> > s3 & s4
{ 'c' , 'b' }
>> > s3 | s4
{ 'd' , 'c' , 'b' , 'a' }
>> > s3 - s4
{ 'a' }
>> > s4 - s3
{ 'd' }
>> > s2. add( 100 )
>> > s2. pop( )
100
>> > s2. remove( 50 )
>> > s3. union( s4)
{ 'd' , 'c' , 'b' , 'a' }
>> > s3. intersection( s4)
{ 'c' , 'b' }
>> > s3. difference( s4)
{ 'a' }
>> > s5 = s3. union( s4)
>> > s3. issubset( s5)
True
>> > s5. issuperset( s3)
True
>> > from random import randint
>> > nums = [ randint( 1 , 50 ) for i in range ( 20 ) ]
>> > nums
[ 36 , 41 , 6 , 44 , 45 , 30 , 48 , 20 , 45 , 50 , 25 , 28 , 39 , 20 , 14 , 22 , 24 , 4 , 18 , 44 ]
>> > set ( nums)
{ 36 , 4 , 6 , 39 , 41 , 44 , 45 , 14 , 48 , 50 , 18 , 20 , 22 , 24 , 25 , 28 , 30 }
>> > list ( set ( nums) )
[ 36 , 4 , 6 , 39 , 41 , 44 , 45 , 14 , 48 , 50 , 18 , 20 , 22 , 24 , 25 , 28 , 30 ]
>> > result = [ ]
>> > for i in nums:
. . . if i not in result:
. . . result. append( i)
练习3:找到mima中有passwd中没有的行
[ root@localhost day05]
[ root@localhost day05]
[ root@localhost day05]
>> > with open ( '/tmp/mima' ) as f1:
. . . s1 = set ( f1)
>> > with open ( '/tmp/passwd' ) as f2:
. . . s2 = set ( f2)
>> > s3 = s1 - s2
>> > s3
{ 'how are you?\n' , 'hello world!\n' }
>> > with open ( '/tmp/result.txt' , 'w' ) as f3:
. . . f3. writelines( s3)
[ root@localhost day05]
how are you?
hello world!