您的位置:首页 > 编程语言 > Python开发

python学习(3)——字典,函数及其高级特性

2017-07-11 18:54 615 查看

字典

1、字典的创建

字典是python中唯一的映射类型,字典的每一对键值key-value用冒号分开,每个对之间用逗号分开,用{}定义,如下所示:

dict={"key1":"value1","key2":"value2"}


字典对象是可变的,但key必须用不可变对象(可以用数字,字符串或元组,不能用列表)。

定义字典时,一般有2种方法:

一是直接定义,如:

dict={"blue":"123","red":"456"}


二是内建方法:fromkeys(创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应的初始值(默认为None))

d={}.fromkeys(('name','passwd'),'123456')
#表示:{'name': '123456', 'passwd': '123456'}


2、访问字典的值

1)直接通过key访问

2)循环遍历访问



3、字典key-value的添加

可以通过dic[key] = value直接进行添加



我们会发现字典是无序的数据类型(指元素内部的存放数据与元素的放入顺序无关)

4、字典的删除

dic={'a':1,'b':2,'c':3,'d':4}


• dic.pop(key)

根据key值删除字典的元素;

• dic.popitem()

随机删除字典元素,返回(key,value)

• dic.clear()

删除字典中的所有元素

• del dic

删除字典本身



5、修改字典

修改时,可直接通过key值修改value,但不能修改key。



另外,在字典中,key是唯一的,所以在创建字典时,如果有重复的key,会替代已有的。(所以字典的fromkeys方法也可以用来去重)

6、字典的常用方法

1)dict.keys()——返回字典的所有key值

2)dict.values()——返回字典的所有values值



3)dict.get()——判断如果key存在于字典中,返回对应value值

4)dict.has_key()——判断字典中是否存在某个key值,返回True,False



5)dict.update()——用另一个字典来更新自己(不存在的添加,存在的更新)



7、总结

•字符串——’ ‘,” “,”“” “”“,”’ ”’

有序序列,不可变数据类型

•列表——[]

有序序列,可变数据类型

•元组——() ,(1,),(1,2)

有序序列,不可变数据类型

•集合——{1,2}(不能为空)

无序,可变数据类型

•字典——{},{“key”:”value”}

无序,可变数据类型

函数

定义一个函数

• 以 def 关键词开头,后接函数标识符名称和圆括号()和冒号 :(括号中的参数)

• 函数内容以冒号起始,并且缩进。

• 在缩进块中编写函数体,函数的返回值用 return 语句返回。一旦遇到return,函数就执行完毕,并将结果返回。没有遇到return时,返回值None。

def fun():
return "hello"
print "world"
print "hi"
print fun()


会返回hi、hello,不会返回world

•空函数

——定义一个什么事也不做的空函数,可以用 pass 语句,pass 用来作为占位符

def fun():
pass
return


函数调用与参数检查

Python 内置了很多有用的函数,如abs(),cmp()等我们可以直接调用。

但像abs()的作用是求绝对值,当传递给它的参数不是数字时,就会发生错误。这是数据类型的错误,它的检查可以用内置函数 isinstance 实现。

如:用isinstance判断参数是否是数值型的,再调用函数abs()求绝对值。

def myabs(aaa):
if isinstance(aaa, (int,float,long)):
print abs(aaa)   #调用函数
else:
print "请输入一个数字!!"
aaa = -2.2
myabs(aaa)


几种错误的提示信息:

数据类型不对——TypeError: bad operand type for abs(): ‘str’

参数个数不对——TypeError: myabs() takes exactly 1 argument (0 given)

函数返回值

函数可以返回多个值,实质上是返回一个元组tuple,

例,返回2个数的平均值和较大的那个数。

def fun(x,y):
if not isinstance(x,int) or not isinstance(y,int):
print 'Error Type'
avg = sum((x, y)) / 2
t = max(x, y)
return (avg, t)

print fun(6,3)


结果:


返回时元组可以省略括号,即函数调用接收返回值时,按照位置赋值给变量。如:

myavg, myt = fun(6,3)
print myavg, myt


函数参数

在调用函数时可使用的参数类型有4种

这4种参数定义的顺序是:必选参数 > 默认参数 > 可变参数 > 关键字参数

•必选参数 ,默认参数

必选参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

调用函数时,默认参数的值如果没有传入,则被认为是默认值。

而且必选参数在前,默认参数在后,如果默认参数在前,就会报错。

例:计算一个数的n次方,n默认为2

def pow(x, n=2):
return x ** n
print pow(3)
print pow(3, 4)


结果为:


注意:默认参数必须是不可变数据类型

•可变参数

可变参数又叫位置参数,就是传入的参数个数是可变的,可以是 1 个、2 个到任意个,还可以是 0 个。

通常用args作为形参,接收的数据类型为元组。加了星号()的变量名会存放所有未命名的变量参数。

如果想将一个列表或者元组传入函数,也可通过*li ,将参数传入函数里。

例:传入一串数字,返回最大的和最小的

def fun(*args):
print type(args)
return max(args),min(args)
li = 1,23,6,58,9,11
print fun(*li)


结果:


•关键字参数

关键字参数和可变参数在用法上类似,它的形参是 **kwargs,kwargs接收的是字典。它使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

例:

def enroll(name,age=22,**kwargs):
print "name:", name
print "age:", age
for k,w in kwargs.items():
print '%s:%s' %(k,w)

enroll('blue',myclass='运维班',gender='女')


结果:


变量的作用域

变量分为2种,分别是:

• 局部变量:只能在函数内部使用的变量

• 全局变量:在整个程序中使用的变量

(可以用global强制将局部变量转换为全局变量,需要先转换,再赋值等

global  b
b=1




函数的高级特性

递归

递归简单来说就是对一个可以重复相同步骤的问题,反复的调用同一个函数进行解决问题。它有以下一些特点或要求:

1、在写递归函数时要有一个明确的结束条件;

2、在递归时,问题规模要越来越小;

3、递归函数效率不高,函数调用是通过栈的数据结构实现的,

4、每调用依次,栈就会多一层,最多999层,否则会出现栈溢出。

例如:求一个数(n)的阶乘,可以把它看成(n-1)*n,这样依次缩小问题

def fact(n):
if n <=
b6a7
0:
print "error"
elif n == 1:
return 1
else:
return fact(n-1)*n
n = input()
print fact(n)


运行结果:



函数式编程

编程语言一般分为以下几类:

面向对象编程语言:java,c++, python

面向过程编程语言:c

面向函数编程语言(lisp,erlang)

列表生成式

列表生成式是Python 内置的非常简单却强大的可以用来创建 list的生成式

举一个简单的例子:

用 range(1, 8)可以生成1-7的列表,如果我们想要生成这些数的平方,我们第一个想到的就是循环。

li=range(1,8)
ll1=[]
print li
for i in li[:]:
ll1.append(i*i)
print ll1


在这里,我们将学习使用列表生成式一步解决问题:

print [ i*i for i  in range(1,8)]




这样看起来比循环就简单了很多

列表生成式的书写格式:[i*i for i in range(1 , 8)]

第一:把要生成的元素 i*i 放到前面

第二:后面跟上for循环

这样就可以把list创建出来。

(for循环后面还可以加上if判断等语句,实现更复杂的功能)

如:

print [ i*i for i in range(0,20) if i %2 == 0]

筛选出偶数

print [ i+j for i in ‘123’ for j in ‘ABC’]

使用两层循环,生成全排列



小练习:

定义列表li = [‘HEllo’,’World’]

返回:[‘hello’,’world’]

li = ['HEllo', 'World', 1]
print [i.lower() for i in li if isinstance(i, str)]


先判断i是否是字符串,在将列表中的每一个字符串小写。

注意:

它只能用于可迭代数据类型,在我们学过的数据类型中,字符串、整型、列表、元组、集合、字典中,只有整型不是可迭代的。

生成器

• 定义:

在循环的过程中不断推算出后续的元素呢。

在 Python 中,这种一边循环一边计算的机制,称为生成器(Generator)

• 为什么需要生成器:

通过列表生成式,我们可以直接创建一个列表,受到内存限制,列表容量肯定是有限的。

生成器的创建方式:

1)把一个列表生成式的[ ] 改为 ( )



访问它的方法:

(1)循环(常用)



(2)g.next()



2)使用 yield的关键字,如果一个函数中又了yield的关键字,它就变成了一个generator了

例如:定义一函数fib,实现斐波那契数列(Fibonicci)

1 1 2 3 5 8 13 21…

def fib(max):
n,a,b = 0,0,1
while n < max:
yield b
a, b = b, a+b
n += 1
for i in fib(4):
print i


结果:


我们需要理解的是他的过程,当它遇到yield时,退出函数,执行外面的语句,执行完了之后,在回到退出的那一行继续执行后面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: