-
python学习笔记(二)
一、tuple和list数据类型
共同点:
都是有序集合,集合的元素类型可以是不同的数据类型;
第1元素索引为0,都可以用 变量[索引] 这样方式访问元素。最后一个元素索引号也可以是-1表示,以此类推。
不同点:list集合的元素可以改变,集合用[]括号;
tuple集合不可以改变,集合用()括号。
#list定义 >>> classmates = ['Michael', 'Bob', 'Tracy'] #tuple定义 >>> classmates = ('Michael', 'Bob', 'Tracy')
定义只有一个元素的tuple,必须要以,号末尾:
>>> a=(1,)
计算元素个数:
>>> a = (1,2) >>> len(a) 2
list元素的操作:
>>> classmates = ['Michael', 'Bob', 'Tracy'] #末尾加元素 >>> classmates.append('Adam') #插入元素到指定位置 >>> classmates.insert(1, 'Jack') #删除末尾元素 >>> classmates.pop() #删除某个指定位置的元素 >>> classmates.pop(1) #替换元素内容 >>> classmates[1] = 'Sarah' #元素也可以是另一个list/tuple >>> s = ['python', 'java', ['asp', 'php'], 'scheme'] #可以用二维数组方式访问 >>> s[2][1] #tuple的元素也可以是List >>> t = ('a', 'b', ['A', 'B']) >>> t[2][0] = 'X' >>> t[2][1] = 'Y' >>> t ('a', 'b', ['X', 'Y'])
二、条件判断
if语句完整表达式:
if <条件判断1>: <执行1> elif <条件判断2>: <执行2> elif <条件判断3>: <执行3> else: <执行4>
注意: 条件判断也可以只是一个变量,只要变量
是非零数值、非空字符串、非空list等,就判断为True
,否则为False
。
三、循环
1、for...in:把list或tuple的每个元素迭代出来:
names = ['Michael', 'Bob', 'Tracy'] for name in names: print(name)
额外:
range(n)函数:生成0-n的整数序列;
list()函数:转换成list。
2、while:满足条件就不断循环,直至条件不满足为止:
3、break和continue:
break直接退出循环;
continue只是跳出此次循环。
四、dict和set类型
dict:key-value类型,用{}括号表示。
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} >>> d['Michael']
dict优点:能快速根据key查到相应value,缺点是内存占用大。
判断key是否存在,可用in:
>>> 'Thomas' in d False
get方法可以安全地获取指定key的value:
>>> d.get('Thomas') #key不存在,返回None >>> d.get('Thomas', -1) #key不存在,返回-1默认值 -1 >>> d.pop('Bob') #删除指定key值
set: 一组key集合,没有value,且key不重复。key值也不排序。
set可以看成是无序和无重复元素的集合。
创建set,要用list或者tuple作为输入:
>>> s = set([1, 2, 3]) >>> s {1, 2, 3}
add方法可以添加元素到set中,可重复添加:
>>> s.add(4) >>> s {1, 2, 3, 4} >>> s.add(4) #无效果 >>> s {1, 2, 3, 4}
remove删除元素:
>>> s.remove(4) >>> s {1, 2, 3}
两个set可以做数学意义上的交集、并集等操作:
>>> s1 = set([1, 2, 3]) >>> s2 = set([2, 3, 4]) >>> s1 & s2 {2, 3} >>> s1 | s2 {1, 2, 3, 4}
dict与set的区别:
唯一区别是set没有对应的value,
相同点是不可以放入可变对象。
>>> s=set((1,2)) >>> s {1, 2} >>> s.add((1,2)) >>> s {1, 2, (1, 2)} >>> s.add((1,[2,3])) #此代码会报错,因为tuple的元素中包含list,list是可变对象 Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> s.add((1,[2,3])) TypeError: unhashable type: 'list'
五、函数
python的内置函数,可参考:http://docs.python.org/3/library/functions.html
函数定义:
def def_name(param): <函数语句体>
从其他定义好函数的py文件中引入:
>>> from abstest import my_abs #abstest.py文件中引入my_abs函数 >>> my_abs(-9) 9
空函数:用pass语句
def nop(): pass #pass为占位符,可使代码运行时不出错
参数类型检查:
python不会自动检查参数类型,所以使用内置函数isinstance()实现:
def my_abs(x): if not isinstance(x, (int, float)): raise TypeError('bad operand type'); if (x > 0): return x; else: return -x;
返回多个值:利用tuple类型返回多个值
import math def move(x, y, step, angle=0): nx = x + step * math.cos(angle) ny = y - step * math.sin(angle) return nx, ny #这里返回多个值,实质是返回tuple
>>> r = move(100, 100, 60, math.pi / 6) >>> print(r) (151.96152422706632, 70.0)
六、各种函数的参数定义
1、位置参数:即普通参数。
定义后,调用函数时,位置参数值必须传入。
2、默认参数:
def func(x, n=2): #默认参数要放在位置参数后面 return x+n >>>func(1) 3
定义了多个默认参数的函数,调用时可按顺序提供参数值。也可以不按顺序提供,这时需要将参数名写上。
def sum(x, y=2, z=3): return x+y+z; sum(1, 10) #z参数使用默认值 sum(1, z=10) #y参数使用默认值
注:定义默认参数值,一定要指向不变对象。因为Python函数在定义时,默认参数值已经计算出来了。
def add_end(L=[]): L.append('END') return L >>> add_end() ['END'] >>> add_end() ['END', 'END'] #第二次的调用开始出问题了。 >>> add_end() ['END', 'END', 'END']
以上例子可改为:
def add_end(L=None): if L is None: L = [] L.append('END') return L
3、可变参数:
参数定义前加*号,代表可传入0个或任意多个参数。
函数调用时,实际自动组装为一个tuple。
def sum(*numbers): result = 0 for num in numbers: result = result + num return result >>>sum(1, 2, 3) 6 >>>nums = [1,2,3] >>>sum(*nums) #传入list或tuple元素可变成可变参数传入 6
4、关键字参数
**号前缀定义的参数,允许可传入0个或任意个含参数名的参数。
函数调用时,会将这些参数组装成dict。
def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw) >>>person('Michael', 30) name:Michael age:30 orther:{} >>>person('Mochael', 30, city='Beijing', job='Engineer') name:Michael age:30 orther:{'city':'Beijing', 'job'='Engineer'} >>>extra={'city':'Beijing', 'job'='Engineer'} >>>person('Jack', 24, **extra) #可以将dict设为关键字参数传入,注意,**kw参数获得的是extra的一个拷贝 name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
5、命名关键字参数
限制传入的关键字参数,明确指定要传入的参数名。
定义方式有两种:
def person(name, age, *, city='Beijing', job): #*号后的所有参数都是命名关键字参数
print(name, age, city, job)
>>> person('Jack', 24, city='Beijing', job='Engineer') #调用时要明确参数命名
>>> person('Jack', 24, job='Engineer') #命令关键字参数有默认值时,可不传入
def person(name, age, *args, city, job): #args可变参数后的都是命名关键字参数 print(name, age, args, city, job)
五种参数的组合顺序:位置参数(无默认值)、默认参数、可变参数、命名关键字参数、关键字参数。