python基础3
交换:
a,b=b,a
相当于定义了一个元组t=(b,a)
然后将t[0]的值给了a,t[1]的值给了b
####字典####
定义用花括号
集合定义若为空的话,会默认为字典,所以集合不能为空
子典只能通过关键字来查找值,因为字典是key-value(关键字-值),因此不能通过值来查找关键字
In [1]: dic = {"user1":"123","user2":"234","user3":"789"}
In [3]: dic["234"]
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-3-2845b64d96b1> in <module>()
----> 1 dic["234"]
KeyError: '234'
字典是一个无序的数据类型,因此也不能进行索引和切片等操作。
In [1]: dic = {"user1":"123","user2":"234","user3":"789"}
In [2]: dic["user1"]
Out[2]: '123'
In [5]: dic["user2"]
Out[5]: '234'
In [7]: user = ['user1','user2','user3']
In [8]: passwd = ['123','234','456']
In [9]: zip(user,passwd)
Out[9]: [('user1', '123'), ('user2', '234'), ('user3', '456')]
In [10]:
当你有一个用户名单和密码,若使用列表的类型,判断用户是否和密码一致时,就比较麻烦,而使用字典时,只需通过关键子就可以返回相对应的值,(如上例子:当定义一个子典当你搜索user1时,字典类型就会返回该关键字对应的密码,此时只需判断该密码是否匹配即可)
####字典的基本操作###
In [17]: dic.
dic.clear dic.items dic.pop dic.viewitems
dic.copy dic.iteritems dic.popitem dic.viewkeys
dic.fromkeys dic.iterkeys dic.setdefault dic.viewvalues
dic.get dic.itervalues dic.update
dic.has_key dic.keys dic.values
字典添加
In [12]: dic
Out[12]: {'user1': '123', 'user2': '234', 'user3': '789'}
In [13]: dic["westos"]='linux'
In [14]: dic
Out[14]: {'user1': '123', 'user2': '234', 'user3': '789', 'westos': 'linux'}
In [15]: dic["hello"]='world'
In [16]: dic ####由此可以看出字典是无序的,在添加时,并不会按照顺序往后添加####
Out[16]:
{'hello': 'world',
'user1': '123',
'user2': '234',
'user3': '789',
'westos': 'linux'}
In [17]:
字典更新
In [22]: dic
Out[22]: {'hello': 'world', 'user1': '123', 'user2': '234', 'user3': '789'}
In [23]: dic["user1"]="redhat" ###可直接通过赋值对关键字进行更新###
In [24]: dic
Out[24]: {'hello': 'world', 'user1': 'redhat', 'user2': '234', 'user3': '789'}
###或者通过dic.update更新###
In [25]: dic
Out[25]: {'hello': 'world', 'user1': 'redhat', 'user2': '234', 'user3': '789'}
In [26]: help(dic.update)
Help on built-in function update:
update(...)
D.update([E, ]**F) -> None. Update D from dict/iterable E and F.
If E present and has a .keys() method, does: for k in E: D[k] = E[k]
If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
In either case, this is followed by: for k in F: D[k] = F[k]
(END)
In [28]: dic1={'yunwei':"westos",'user1': 'redhat'}
In [29]: dic.update(dic)
dic dic1 dict
In [29]: dic.update(dic1) ###将dic1中dic所没有的更新给了dic###
In [30]: dic
Out[30]:
{'hello': 'world',
'user1': 'redhat',
'user2': '234',
'user3': '789',
'yunwei': 'westos'}
In [31]:
####若是关键字相同,而值不同,就将值更新给他####
In [35]: dic
Out[35]: {'hello': 'world'}
In [36]: dic1
Out[36]: {'user1': 'redhat', 'yunwei': 'westos'}
In [37]: dic1["hello"]="hai"
In [38]: dic.update(dic1)
In [39]: dic
Out[39]: {'hello': 'hai', 'user1': 'redhat', 'yunwei': 'westos'}
In [42]: dic.clear() ###清空dic###
In [43]: dic
Out[43]: {}
In [44]: del(dic) ###删除dic###
In [45]: dic
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-45-1b445b6ea935> in <module>()
----> 1 dic
NameError: name 'dic' is not defined
####字典的删除####
In [49]: dic1
Out[49]: {'user1': 'redhat', 'yunwei': 'westos'}
In [50]: dic1.pop("user1") ###指定关键字,删除该关键字和值####
Out[50]: 'redhat'
In [51]: dic1
Out[51]: {'yunwei': 'westos'}
In [52]:
In [74]: dic1.popitem() ###不指定关键字,随即删除###
Out[74]: ('yunwei', 'westos')
In [77]: dic = {"hello":"123","westos":"linux"}
In [79]: dic.keys() ###查看dic的全部关键字###
Out[79]: ['hello', 'westos']
In [80]: dic.values() ###查看dic的全部值###
Out[80]: ['123', 'linux']
In [82]: dic.get("hello") ###得到相对应的关键字的值,若关键字不存在,则默认返回none
Out[82]: '123'
In [83]: dic.get("redhat")
In [84]: print dic.get("redhat")
None
In [87]: dic.has_key("hello") ###查看是否有该关键字,
Out[87]: True
In [88]: dic.has_key("world")
Out[88]: False
dict.fromkeys() ###可以通过该操作实现去重###
In [89]: dic
Out[89]: {'hello': '123', 'westos': 'linux'}
In [90]: dic.fromkeys([1,2,3,4])
Out[90]: {1: None, 2: None, 3: None, 4: None}
In [91]: dic.fromkeys([1,2,3,4],'hello')
Out[91]: {1: 'hello', 2: 'hello', 3: 'hello', 4: 'hello'}
In [38]: d = {}
In [32]: li = [1,2,3,1,2,3] ###去重###
In [33]: d.fromkeys(li)
Out[33]: {1: None, 2: None, 3: None}
In [34]: d.fromkeys(li).keys()
Out[34]: [1, 2, 3]
字典的key必须是不可变的数据类型
In [94]: dic = {1:'1',2:'2',1:'a'}
In [95]: dic
Out[95]: {1: 'a', 2: '2'} ###一个关键字只能对应一个值###
In [96]: for key in dic.keys(): ###逐个遍历key###
....: print "key=%s" % key
....:
key=1
key=2
In [97]: for value in dic.values(): ###逐个遍历value的值###
print "value=%s" % value
....:
value=a
value=2
In [98]: for key,value in dic.keys(),dic.values(): ###逐个遍历key -> value 的值#####
....: print "%s -> %s" %(key,value)
....:
1 -> 2
a -> 2
In [100]: dic
Out[100]: {1: 'a', 2: '2'}
In [101]: dic.items() ###以元组的形式一一对应key和value的值###
Out[101]: [(1, 'a'), (2, '2')]
In [102]: for k,v in dic.items():
.....: print "%s -> %s" %(k,v)
.....:
1 -> a
2 -> 2
和list的比较,dict的不同:
1 查找和插入的速度快,字典不会随着key值的增加查找速度减慢
2 占用内存大,浪费空间
小练习:
去掉一个最高分和最低分,并且显示平均值
li = [90,91,67,100,89]
In [103]: li = [90,91,67,100,89]
In [104]: li.sort() ###排序###
In [105]: li
Out[105]: [67, 89, 90, 91, 100]
In [106]: li.pop()
Out[106]: 100
In [107]: li.pop(0)
Out[107]: 67
In [108]: li
Out[108]: [89, 90, 91]
In [109]: sum(li)/len(li) ###sum函数求和###
Out[109]: 90
小练习:用字典实现case语句:
!/usr/bin/env python
#coding:utf-8
from __future__ import division
num1 = input("num1:")
oper = raw_input('操作:')
num2 = input('num2:')
dic = {"+":num1+num2,"-":num1-num2,"*":num1*num2,'/':num1/num2}
if oper in dic.keys():
print dic[oper]
#####函数####
函数名的理解:函数名与变量名类似,其实就是指向一个函数对象的引用;
给这个函数起了一个“别名”:函数名赋给一个变量
In [5]: sum(li)
Out[5]: 6
In [6]: a = sum ###将sum的函数名给了a变量,使得a能够进行求和###
In [7]: a(li)
Out[7]: 6
In [8]:
In [8]: sum = abs
In [9]: sum(-1)
Out[9]: 1
In [10]: sum([2,4,5] ###将abs的函数名给了sum,则sum就不再具有求和的功能###
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-10-d3c81a94a2a0> in <module>()
----> 1 sum([2,4,5])
TypeError: bad operand type for abs(): 'list'
In [11]: a([2,4,5])
Out[11]: 11
####函数的返回值###
def hello():
print "hello"
print hello() ###该函数没有返回值,只是打印了hello,返回值为none
def hello():
return ”hello“
print hello() ###该函数有返回值,则返回一个hello###
####函数在执行过程中一旦遇到return,就执行完毕并且将结果返回,如果没有遇到return,返回值为none###
###定义一个什么也不做的空函数,可以用pass语句,作为一个占位符使得代码先运行起来
def hello():
return "hello"
def world():
pass
print hello()
print world()
运行结果:
/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/10.py
hello
None
Process finished with exit code 0
小练习:将abs的错误显示进行优化###
def my_abs(x):
if isinstance(x,(int,float)): ###判断数据类型,是int或是float(也可以是别的类型,看你写的)###
print abs(x)
else:
print "请输入整型或浮点型的数"
my_abs("a")
my_abs(123)
执行结果:
/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/11.py
请输入整型或浮点型的数
123
Process finished with exit code 0
小练习:定义一个函数func(name),该函数效果如下:
func('hello') -> 'Hello'
func('World') -> 'World'
def func(name):
print name.capitalize()
name = raw_input("name:")
func(name)
执行结果:
/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/12.py
name:hello
Hello
Process finished with exit code 0
函数的返回值,函数可以返回多个值
小练习:定义一个函数func,传入两个数字,返回两个数字的最大值和平均值
def func(x,y):
if x>y:
return x,(x+y)/2
else:
return y,(x+y)/2
x=6
y=3
print func(x,y)
执行结果:
/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/13.py
(6, 4) ###由此可见,返回多个值,实际上是返回一个元组###
Process finished with exit code 0
###返回的元组的括号可以省略,函数调用接受返回值时,按照位置赋值变量###
def func(x,y):
if x>y:
return x,(x+y)/2
else:
return y,(x+y)/2
x=6
y=3
avg,maxnum = func(x,y)
print avg,maxnum
执行结果:
/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/13.py
6 4
Process finished with exit code 0
###函数的参数###
def power(x,n=2): ###设定n默认为2,则n为默认参数,x为必选参数###
return x**n
print power(2)
def power(x,n=2):
return x**n
print power(2,4) ###也可以进行多次操作###
####当默认参数和必选参数同时存在时,一定要将必选参数放在默认参数之前###
###设置默认参数时,把变化大的参数放前面,变化小的参数放后面,将变化小的参数设置为默认参数###
def enroll(name,age=22,myclass="westoslinux"):
print 'name=%s'% name
print 'age:%d'% age
print 'class:%s' %myclass
enroll('user1')
enroll('user2',20)
enroll('user3',18,'全能班')
执行结果:
name=user1
age:22
class:westoslinux
name=user2
age:20
class:westoslinux
name=user3
age:18
class:全能班
Process finished with exit code 0
###默认参数必须使不可变的数据类型###
例:
先定义一个函数,传入一个 list,添加一个END 再返回
def fun(li=[]):
li.append("END")
return li
print fun([1,2,3])
print fun()
print fun()
执行结果:
/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/14.py
[1, 2, 3, 'END']
['END']
['END', 'END'] ###因为列表是可变的数据类型,所以在第二次输入print fun()时,默认参数就不是空,而已经有了一个“END”###
Process finished with exit code 0
更改为:li=None,则此时li的默认值为不可变的数据类型
def fun(li=None):
if li is None:
return ['END']
li.append('END')
return li
print fun([1,2,3])
print fun()
print fun()
执行结果为:
/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/14.py
[1, 2, 3, 'END']
['END']
['END']
Process finished with exit code 0
####可变参数###
定义参数时,形参可以为*args,使函数可与接受多个参数;
如果想要将一个列表或者元组传入参数,也可以通过*li或*t,将参数传入函数里。
def fun(*args): ###参数前面一定要加*###
print type(args)
return max(args),min(args)
li = [1,42,3,14,58,6]
print fun(*li) ###传递列表时,前面也要加*###
执行结果:
/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/14.py
<type 'tuple'>
(58, 1)
Process finished with exit code 0
###若传递列表时,不加*号###
def fun(*args):
print type(args)
return max(args),min(args)
li = [1,42,3,14,58,6]
print fun(li)
执行结果:
/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/14.py
<type 'tuple'>
([1, 42, 3, 14, 58, 6], [1, 42, 3, 14, 58, 6])
Process finished with exit code 0
###传递多个数###
def fun(*args):
print type(args)
return max(args),min(args)
print fun(1,42,3,14,58,6)
执行结果:
/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/14.py
<type 'tuple'>
(58, 1)
Process finished with exit code 0
###关键字可变参数###
def enroll(name,age=22,**kwargs):
print 'name=%s'% name
print 'age:%d'% age
for k,w in kwargs.items():
print '%s:%s'%(k,w)
print type(kwargs)
enroll('user3',myclass='运维班')
执行结果:
/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/14.py
name=user3
age:22
myclass:运维班
<type 'dict'>
Process finished with exit code 0
参数定义优先级:必选参数>默认参数>可变参数>关键字参数
*arg,可变参数接受的是元组
**kwargs,关键字参数,接受的是字典
###局部变量,只在函数内部生效,全局变量,在整个代码中生效###