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

xiaoxiao2021-02-28  98

字典

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 <= 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时,退出函数,执行外面的语句,执行完了之后,在回到退出的那一行继续执行后面。

转载请注明原文地址: https://www.6miu.com/read-76217.html

最新回复(0)