Python基础语法学习

Python语法

Python中的数据类型

  • 整数
  • 浮点数
  • 字符串
    1. 转义字符\,如果想字符串中的\不做转义处理,定义字符串时以r开头,如str = r'\\\n\\'
    2. 定义多行字符串可以不用\n,使用三个单引号括起来
    3. 字符串默认按照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('')

函数

函数的参数

  1. 位置参数

    位置参数即必选参数,是必须要传递的,如:

    def func(a):
        print(a)
    
  2. 默认参数

    默认参数在声明函数时会默认给一个默认值,如果不传则使用默认值,如:

    def func(a b='b'):
        print(a,b)
    

    注意:默认参数要使用不可变对象,否则会导致默认参数变化

  3. 可变参数

    可变参数适用于参数不固定的情况,可以传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)
    
  4. 关键字参数

    关键字参数可以看做是可变参数的升华版,关键字参数允许传递0-n个带参数名的参数,函数内部封装成了一个dict进行处理,定义如下:

    def func(**kw):
        print(kw)
    

    关键字参数起到一个很好的扩展作用,在扩展方法功能时,不用改动函数参数即可实现,十分灵活,如果已经有一个dict了,就可以通过**dict这种方式调用带有关键字参数的函数,如下:

    d = {'a':1, 'b':2}
    func(**d)
    
  5. 命名关键字参数

    对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过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)
    
  6. 万能函数

    基于以上的参数规则,我们可以定义一个万能函数,可以接受各种各样的参数:

    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的切面编程,在不更改原始代码逻辑的前提下增强方法功能

posted @ 2021-04-28 14:48  ThomasYue  阅读(56)  评论(0编辑  收藏  举报