字典:
内置类型字典
字典的定义
dict1 = { } 空字典
dict2 = {'name':'Jack', 'age':40}
key,value 的概念 键和值是单向的
dict2 ['name'] 返回值的内容
dict2 ['age']
就像真正的字典前面的索引
访问不存在的key会导致程序异常
dict2.get('name',default = None)get方法没有定义的键,返回的值默认为none
字典的特性
字典是mutable的,可以存储任意数量的元素,可以存储任何python数据类型(value可以是任何类型;key是可以hash的类型 最常用的效率也是最高的是数字或者字符串,键不能是字典类型)
以key:value,即“键:值”对的形式存储数据,每个键是唯一的
根据键查找值的效率非常高
list、string、tuple特性称之为 sequence
dict 特性称之为 map
定义顺序就是实际顺序(3.6新特性)
d = {1:'abc','1':3.14159,3.2:100}
1 in d =>True
d.haskey('server')python2里有,python 3 没有
del d2 ['name'] 删除元素,del.pop(‘age’)删除元素,会返回元素的值
字典
遍历 for one in alist
students = {
'Mike Green':'age':25.'height':180','weight':80,'nickname':'ohmy'},
Douge Jose':'age':25.'height':180','weight':80,'nickname':'doggy'}
}
列出下面列表中所有学生的年龄
for name in students:
键值
print(f'name:{name:<20},age:{students[name][“age”]}')
变量
或者
for name,info in students.items( ):
print(f'name:{name:<20},age:{info["age"]}')
常用操作
字典也可以用 len()
清空字典内容 d.clear() 对象发生了改变
和d ={} 变量的赋值都不是改变原来指定的对象,变量指向新的对象
例子
def func1(arg):
arg.clear()
a = { 'age':25,'height':180}
func1(a)
print a结果是 {}
def func1(arg):
arg= {}
a = { 'age':25,'height':180}
func1(a)
print a结果是 { 'age':25,'height':180}
得到所有的key返回在List中 d.keys()
得到所有的value返回在List中 d.values()
得到所有的(key,value)返回在List中 d.items()
增加另一个dict的内容
d ={1:'1',2:'2'}
d.update({4:'4',5:'5'})
再识函数
变量的作用域
例子
x =2
def func():
x = 9
print ("this x is in the func:-->",x)
func()
print ("------------------------------")
print ("this x is out of func:-->",x)
全局变量和局部变量
全局变量的有效区域:整个代码文件
局部变量的有效区域:定义的函数里
优先级:都有定义,函数里使用局部变量
函数里面使用全局变量
修改全局变量
x =2
def func():
global x
x = 9
print ("this x is in the func:-->",x)
func()
print ("------------------------------")
print ("this x is out of func:-->",x)
函数的缺省参数
例子
统计超过指定年龄的男女生人数
students = [
{'age':18,'name':'jcy1','gender':'male'},
{'age':20,'name':'jcy2','gender':'female'},
{'age':18,'name':'jcy3','gender':'male'},
{'age':21,'name':'jcy4','gender':'female'},
{'age':22,'name':'jcy5','gender':'male'}
]
def statmf(student,minage):
调用该函数的时候需要传入一个学生列表和年龄条件
statmf(student,18)
statmf(student,20)
函数实现
def statmf(student,minage):
malelist =[]
femalelist = []
for student in students:
if student['age'] > minage:
if student['gender'] == 'male':
malelist.append(student['name'])
elif student['gender'] == 'female':
femalelist.append(student['name'])
print ('the male students are %s ' % ' '.join(malelist))
print ('the female students are %s' % ' '.join(femalelist))
缺省参数
def statmf(student,minage=18):
malelist =[]
femalelist = []
for student in students:
if student['age'] > minage:
if student['gender'] == 'male':
malelist.append(student['name'])
elif student['gender'] == 'female':
femalelist.append(student['name'])
print ('the male students are %s ' % ' '.join(malelist))
print ('the female students are %s' % ' '.join(femalelist))
statmf(student)
statmf(student,20)
不指定,就使用缺省参数
statmf(student) #不会报错
没有缺省值的参数我们可以叫做必填参数
缺省参数可以定义多个,def statmf(a,b=1,c=2,d=3):
定义函数的时候一定要必选参数在前,缺省参数在后 def statmf( minage=0,students):,这个会报错
缺省参数使用非常广泛。内置的库和第三方库里面大量的使用缺省参数
可变数量参数
给定一组数字a,b,c......,请计算a²+b²+c²+......
def calc(numbers):
total = 0
for n in numbers:
total = total + n* n
return total
可以用tuple、list存放参数
calc((1,2,3))或者 calc([1,2,3])
这样调用似乎更方便 calc(1,2,3)
def calc(*numbers):
total = 0
for n in numbers:
total = total + n* n
return total
可以传入任意多的参数,Python解释器会把传入的参数存入一个tuple中,赋值给numbers
调用的时候加*相当于参数展开
如果参数已经在一个list(或者tuple)中,怎么调用 nums=[1,2,3]
当然可以这样 calc(nums[0],nums[1],nums[2])
如果有更多的参数就不方便,可以这样calc(*nums)等价于 calc(nums[0],nums[1],...,nums[n-1])
关键字可变数量参数
允许在调用函数时,传入任意个含参数名的参数
def register_student(name,age,**kargs):
print ('name:',name,'age:',age,'other:',kargs)
除了必选参数name和age外,还接受关键字参数kargs
关键字参数
只传必填参数
>>> register_student ('Michael',30)
name:Michael age:30 other:{}
加上任意个数的关键字参数
>>>register_student ('Bob',35,city = 'Beijing')
name:Bob age :35 other:{'city':'Beijing'}
>>>register_student('Adam',45,gender='M',job = 'Engineer')
name:Adam age:45 other:{'gender':M,'job':'Engineer'}
Python解释器把这些关键字参数存入到一个dict中,传给kargs
参数展开
如果参数已经在一个dict中,怎么调用
students = {'city':‘Beijing’,‘job’:‘Engineer’}
参数展示
register_studenr ('Jack',24,**students)
参数名不能加引号
关键字参数的作用
它可以扩展函数的作用。
比如,在这个注册学生的函数里,
我们必须要有name和age这两个参数
但是,如果调用这愿意提供更多的参数,我们也可以存储下来。
综合起来
必填参数、缺省参数、可变参数和关键字参数
一起使用
def func(a,b,c=0,*args,**kw):
print ('a =',a ,'b =',b,'c=',c)
print ('args =',args,'kw =',kw)
func(1,2,c=3,5)会报错,一旦出现了参数名,后面都得有参数名
可以这样 func(1,2,3,5) args = (5,)
def func(**kw,*args): pass 不能这样定义,会报错
def func(**kw,b=2): pass 报错
>>>def func(*args,b=2):
print ('args =',args,'b=',b)
>>>func(1,3,3, 3)
args = (1,3,3,3) b =2
>>>func(1,3,3, b=3)
args = (1,3,3) b =3