Python基础语法学习
Python语法
Python中的数据类型
- 整数
- 浮点数
- 字符串
- 转义字符\,如果想字符串中的\不做转义处理,定义字符串时以r开头,如str = r'\\\n\\'
- 定义多行字符串可以不用\n,使用三个单引号括起来
- 字符串默认按照Unicode编码,如果要转为以字节为单位的bytes,以b开头,如 b = b'ABC'
- 布尔 Boolean True False
- 空值 None
list和tuple
list表示列表,可随时添加删除其中元素,tuple可理解为不可变的列表,不能增删其中元素,和Java不同,list和tuple中可以存储不同数据类型的元素,如['ABC',123,True]
list
list查询
可通过下标获取list对应的元素,如list[0]获取第一个元素,如果想获取末尾元素采用负数,如list[-1]获取倒数第一个元素,list[-2]获取倒数第二个元素...
list插入
可按照顺序忘list末尾追加元素,采用list.append(),如果想在指定下标插入元素采用list.insert(1, ''),第一个参数为下标地址,第二个参数为要插入的元素,由此可见list的数据结构为链表
list删除
从末尾删除数据采用list.pop(),如果想删除指定下标的元素采用list.pop(1),参数为对应元素下标
tuple
tuple采用()表述,如声明一个tuple,t = ('ABC',123),如果声明一个只有一个元素的tuple,需要这样:t = ('a',),目的是为了和数学公式中的()做区分
tuple不可变,但是如果tuple中的元素是list或者其他可变对象,则其中元素可以变更
dict和set
dict
dict类似Java中的HashMap,可以存储键值对,但是注意key必须是不可变对象,比如字符串和整数,因为dict计算存放位置是根据对key的hash进行的,如果key对象可变,则存储位置就乱了。
声明一个dict
d = {'key1':'value1', 'key2':'value2'}
dict取值
- 使用dict['key'],注意如果key不存在则会报错, 所以如果不确定可先判断是否存在,使用 'key' in dict
- 使用dict.get('key', default)方法,可指定默认返回值,比较好用
dict插入
- 直接使用dict['key'] = 'value'
- d = dict('a'=1,'b'=2)
dict删除
直接使用dict.pop('key')
set
set类似Java中的HashSet,它也是通过dict实现,只不过不存储value
声明一个set
- 声明一个set可以通过一个list作为输入:s =set([1,3,4,5])
- 或者直接声明:s = ([1,2,3,4])
set插入
使用s.add('')
set删除
使用s.remove('')
函数
函数的参数
-
位置参数
位置参数即必选参数,是必须要传递的,如:
def func(a): print(a)
-
默认参数
默认参数在声明函数时会默认给一个默认值,如果不传则使用默认值,如:
def func(a b='b'): print(a,b)
注意:默认参数要使用不可变对象,否则会导致默认参数变化
-
可变参数
可变参数适用于参数不固定的情况,可以传0-n个,Java也有类似的定义,如public String test(int... a),在方法内处理a这个参数就可以当做数组处理,Python非常类似,定义一个可变参数如下:
def func(*arg): print(arg)
在处理可变参数时我们可以把这个参数当做一个list或者tuple,如果我们已经有了一个list或者tuple,可按照如下方式调用
l = [1, 2, 3] func(*l)
-
关键字参数
关键字参数可以看做是可变参数的升华版,关键字参数允许传递0-n个带参数名的参数,函数内部封装成了一个dict进行处理,定义如下:
def func(**kw): print(kw)
关键字参数起到一个很好的扩展作用,在扩展方法功能时,不用改动函数参数即可实现,十分灵活,如果已经有一个dict了,就可以通过**dict这种方式调用带有关键字参数的函数,如下:
d = {'a':1, 'b':2} func(**d)
-
命名关键字参数
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过
kw
检查,而命名关键字参数要求调用时必须传递参数名,且命名关键字参数支持设置默认值,为了和位置参数进行区分,在定义命名关键字参数前需要加个,如果函数中包含可变参数则可以省去间隔,举例如下:# 包含默位置参数和命名关键字参数 def func(a, b, *, c, d): print(a,b,c,d) # 调用 func(1, 2, c='c', d= 'd') def func1(a, b, *args, c, d): print(a, b, args, c, d) l = [1, 2, 3] func1(1, 2, l, c, d)
-
万能函数
基于以上的参数规则,我们可以定义一个万能函数,可以接受各种各样的参数:
def func(*args, **kw): print(args, kw)
切片
在编写业务代码时经常会对list进行分割操作,如取前几个元素或者后几个元素,或者单数双数等等,python切片很容易做到这一点,示例如下
l = ['a', 'b', 'c', 'd', 'e', 'f']
# 取前两个元素
l1 = l[0:2]
# 起始位置为0则可以忽略
l1 = l[:2]
# 取后两个元素
l2 = l[-2:]
# 取倒数第二个元素(最后一个元素从-1算)
l3 = l[-2:-1]
# 取前6个数,没两个取一个
l4 = l[:6:2]
# 取所有数,每两个取一个
l5 = l[::2]
# 复制一个list
l6 = l[:]
迭代
可迭代对象都能进行迭代操作,即for i in values,str、list、tuple、dict都是可迭代对象
# 对dict的key进行循环
for k in d:
print(k)
# 对dict的value进行循环
for v in d.values():
print(v)
# 对dict的key value同时循环
for k, v in d.items():
print(k,v)
# 对二元数组循环
for x, y in [(1, 1), (2, 2), (3, 3)]:
print(x, y)
列表生成式
列表生成式可以通过一行代码生成我们想要的list,举例如下:
# 生成[1x1, 2x2, 3x3, ..., 10x10]
[x * x for x in range(10)]
# 二元组组合
[m + n for m , n in [(1, 1), (2, 2), (3, 3)]]
# 双重for循环得到全排列
[m + n for m in range(3) for n in range(3, 6)]
# 筛选所有偶数平方
[x * x for x in range(10) if x % 2 == 0]
# 加上if else,
[x if x % 2 == 0 else -x for x in range(10)]
生成器
生成器允许我们定义一个无限大的列表,但是不是直接创建的,而是边遍历边计算,相当于一种惰性的概念,这样我们定义好生成规则,就可以进行按需遍历了,这样就能节省大量空间,定义一个生成器有如下方法:
列表生成式改进
将列表生成式的[]改为()就变成了生成器,如下:
# 声明一个生成式
g = (x * x for x in range(10))
# 获取下一个元素
next(g)
# 使用for循环
for i in g:
print(i)
注意当手动调用next()函数获取下一个元素时,如果没有可获取的元素了会抛出StopIteration错误
通过函数定义生成器
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
如果一个函数定义中包含yield
关键字,那么这个函数就不再是一个普通函数,而是一个generator
高阶函数
高阶函数即接受函数作为参数的函数
map
map(func, list)函数第一个参数为要执行的函数本身,第二个参数为可迭代对象,执行该函数会遍历第二个函数中的所有元素,并运行第一个参数的函数计算得出一个新的Iterator,示例如下:
# 计算list中每个元素的阶乘
l = [1, 2, 3, 4, 5]
def f(x):
return x * x
m = map(f, l)
reduce
reduce把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数必须接收两个参数,reduce
把结果继续和序列的下一个元素做累积计算,其效果就是
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
示例如下:
# 列表数据求和
def f(x, y):
return x + y
s = reduce(f, [1, 2, 3, 4, 5])
filter
filter起到一个过滤的作用,接受一个返回Boolean结果的函数,如果计算得出True则保留,否则剔除
def f(x):
return x % 2 == 0
# 剔除奇数
l = filter(f, [1, 2, 3, 4, 5])
sorted
sorted是一个排序的高阶函数,可以按照自定义的排序算法对序列进行排序操作
# 对list数字按绝对值大小排序
sorted([1, 5, -3, 2], key=abs)
key接收一个函数,函数会先通过该函数进行计算后再排序,默认升序,如需降序,可再指定一个参数reverse=True
# 对list数字按绝对值大小排序,并翻转
sorted([1, 5, -3, 2], key=abs, reverse=True)
匿名函数
如果函数体比较简单,我们可以直接使用匿名函数,不用再定义函数名,匿名函数通过关键字lambda定义
# 定义一个匿名函数
f = lambda x:x * x
# 在map中使用匿名函数
map(lambda x : x * x, [1, 2, 3, 4, 5])
装饰器
装饰器类似Java的切面编程,在不更改原始代码逻辑的前提下增强方法功能