Python学习笔记
标签: 未分类
基本概念
变量
Python中大小写敏感,变量由字母、数字或者下划线组成,并且只能以字母或者下划线开头。Python中变量名可以认为是指向变量的指针。
运算符
加:+
减:-
乘:*
除:/,这个除法在python3中是浮点数(即使被除数、除数都是整数且能整除)
除法取整(地板除)://
除法取余:%
指数:**
数据类型
数字
不可变类型
字符串(string)
可变类型,字符串支持+,*运算符,可更改,可迭代类型,可以通过序号访问;
字符串格式化
除了使用强制类型转换的方式把字符串与非字符串合并在一起外,还可以使用字符串格式化方式创建字符串(使用字符串的format方法):
nums = [4,5,6]
msg = "Numbers:{0} {1} {2}".format(nums[0],nums[1],nums[2])
print msg
结果输出
Numbers:4 5 6
字符串格式化也可以使用类似命名参数的方式定义:
a = "{x},{y}".format(x=5,y=12)
print(a)
输出:
5,12
列表(list)
中括号【】括起来,各项之间以逗号分开,各项可以是不同数据类型,可以通过序号来访问(从0开始),可更改,可迭代类型,常见list方法有append、insert、index等,也可以使用python内置的len函数来获取list的长度。实际使用中可以使用range函数生成range 对象,然后使用list(range对象)方式把range对象转换得到一个list
numbers = list(range(10))
print (numbers)
结果:>>> [0,1,2,3,4,5,6,7,8,9]
字典(dictionaries)
{}定义,使用[key]的方式访问,使用这种方式式如果key不存在,那么会抛出KeyError异常,另外也可以使用字典的get方法来获取字典的值,此时或者返回具体值,或者返回None,或者返回指定的值(get的第二个参数)
pairs = {1:'apple','orange':[2,3,4],True:False,None:'True'}
print(pairs.get('orange')
print(pairs.get(7)
print(pairs.get(12345,'Not in dictionary')
结果输出:
[2,3,4]
None
Not in dictionary
元组(tuple)
元组与list非常相像,不同的是元组是不可变的,使用()创建
列表高级功能
分片、列表生成式(evens = [i**2 for i in range(10) if i**2 % 2 == 0])
处理异常(exception)
try/except:把可能出现异常的语句放在try:代码块,如果有异常发生,try代码块停止执行(即try块抛出异常的语句之后的语句将得不到执行),转而执行except:代码块。如果没有异常发生,那么except:代码块将不会被执行。一个try代码块可以有多个except代码块,分别处理不同的异常,一个except也可以处理多个异常:
try:
variable = 10
print(variable + "hello")
print(variable / 0)
except ZeroDivisionError:
print("Divided by zero")
except (ValueError, TypeError):
print("Error occurred")
代码运行输出:>>> Error occurred
except之后也可以不指定异常类型,那么所有的异常都将会被捕获:
try:
word = "spam"
print(word / 0)
except:
print("An error occurred")
还有另外一种使用方式:try…except…finally,finally:代码块中的语句将永远会得到执行(不管try代码块中是否产生异常,甚至不管异常是否有被捕获处理);
可以使用raise抛出异常,可以使用assert来判定某个条件是否成立,如果为假则也会抛出异常:
print(1)
assert 2 + 2 == 4
print(2)
assert 1 + 1 == 3
print(3)
输出>>
1
2
AssertionError
assert也可以添加第2个参数(字符串),当AssertionError发生时会打印出来:
temp = -10
assert(temp >= 0),"Colder than absolute zero"
输出:>>> AssertionError:Colder than absolute zero
如果AssertError发生后没有被捕获被处理,那么程序会被终止,这是与其他异常异常不同的地方*
函数式编程
所谓的函数式编程,就是使用函数名做参数,或者返回函数名。
lambda
通常函数都是使用def 加函数名称(本质上是变量)方式来定义,但也可以不带函数名的方式(匿名方式)来定义函数,这就是lambda,lambda后直接跟函数参数然后:之后带表达式(只能是单个表达式,通常意义上来说也就是一行语句)。实例:
def my_func(f,arg):
return f(arg)
my_func(lambda x : 2*x*x, 5)
map & filter
map函数名作为第一个参数,把可迭代数据类型(列表、元组、字典、字符串)作为第二个参数,完成的功能就是把第一个参数作用到第二个参数上,返回map对象,可以通过list函数显示的转换。
def add_five(x):
return x + 5
nums = [11,22,33,44,55]
result = list(map(add_five,nums))
print(result)
输出结果:
[16,27,38,49,60]
当然,map中的函数也可以使用lambda方式,对于上面的例子,可以使用类似如下形式:
result = list(map(lambda x:x + 5,nums))
filter函数使用形式与map类似,其含义是通过第1个参数中的函数对第2个参数中的数据进行筛选,只保留能使第1个函数返回值为真的数据。实例:
mums = [11,22,33,44,55]
res = list(filter(lambda x:x%2==0, nums))
print(res)
输出结果:
[22,44]
生成器(generators)
生成器也是一种可迭代类型,与list,tuple等相似,但是不同的是生成器不能通过索引访问,只能通过for循环迭代,定义方式是通过函数+yield语句的方式。
def countdown():
i = 5
while i > 0:
yield i
i -= 1
for i in countdown():
print(i)
结果:
5
4
3
2
1
yield语句表明这个是一个生成器(而非函数),它代替return语句返回返回值,但是返回之后本地变量并不会被销毁。因为yield每次返回一个值,因此它没有list的内存限制,这个在进行大数据处理时很有用。当然生成器也可以通过list强制类型转换转换为普通列表。
def numbers(x):
for i in range(x):
if i % 2 == 0:
yield i
print(list(numbers(11)))
输出结果:
[0,2,4,6,8,10]
生成器的另外一种定义方式是通过列表生成式定义:只需要把列表生成式的[]更改为()即可。
L = [x*x for x in range(10)]
print(L)
g = (x*x for x in range(10))
print(g)
输出:
[0,1,4,9,16,25,36,49,64,81]
<generator object <genexpr> at 0x00000248898BFF10>
可以使用for循环打印g中数据(for i in g:),也可以使用next(g)逐个获得g中元素,直到StopIteration异常(超出g范围)