
Python-study

Python学习笔记
(Python教程 - 廖雪峰的官方网站 (liaoxuefeng.com) )
By:jrl
一、Python基础
1.多行注释:
2.变量:

3.除法:
4.Unicode与Utf-8:
Unicode虽然范围广,可以编码汉字,但是占存储空间大,所以转为Utf-8储存。
5.字符编码:
由于Python的字符串类型是str
,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str
变为以字节为单位的bytes
。
文件开头一般写入的注释:
1 | #!/usr/bin/env python3 |
6.格式化字符串的方法:
1)使用占位符
1 | 'Age: %s. Gender: %s' % (25, True) |
2)foramt()
3)f-strng
7.list与tuple
(1)list
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
1 | #eg |
(2)tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改
1 | classmates = ('Michael', 'Bob', 'Tracy') |
8.条件判断
elif(else if)
1 | age = 20 |
input()的返回类型是str,str不能直接与整数比较,须转化
1 | s = input('birth: ') |
9.循环
(1)for in 循环
1 | #历遍list或者tulpe中的元素 |
当须历遍的范围过大时,可使用range()函数
1 | list(range(5)) #[0, 1, 2, 3, 4] 0-4 |
(2)while循环
只要条件满足,就不断循环,条件不满足时退出循环
1 | sum = 0 |
break
在循环中,break语句可以提前退出循环
1 | n = 1 |
continue
在循环过程中,也可以通过continue
语句,跳过当前的这次循环,直接开始下一次循环。
1 | n = 0 |
10.dict和set
(1)dict
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢,给定一个名字,比如'Michael'
,dict在内部就可以直接计算出Michael
对应的存放成绩的“页码”,也就是95
这个数字存放的内存地址,直接取出来,所以速度非常快。
1 | #初始化 |
由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉,如果key不存在,dict就会报错要避免key不存在的错误,有两种办法
一是通过in
判断key是否存在:
1 | 'Thomas' in d |
二是通过dict提供的get()
方法,如果key不存在,可以返回None
,或者自己指定的value:
1 | d.get('Thomas') |
1 | 要删除一个key,用pop(key)方法,对应的value也会从dict中删除: |
dict与list比较
请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。
这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:
(2)set
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
1 | #要创建一个set,需要提供一个list作为输入集合: |
set与dict比较
set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。
不可变对象
str是不变对象,而list是可变对象
1 | #对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如: |
二、函数
1.调用函数
可以通过官网来调查函数: http://docs.python.org/3/library/functions.html#abs
也可以在交互式命令行通过help(),查看函数的帮助信息。
1 | #eg: 数据类型转换 |
函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”:
1 | abs # 变量a指向abs函数 a = |
2.定义函数
在Python中,定义一个函数要使用def
语句,依次写出函数名、括号、括号中的参数和冒号:
,然后,在缩进块中编写函数体,函数的返回值用return
语句返回。
我们以自定义一个求绝对值的my_abs
函数为例:
1 | def my_abs(x): |
交互式环境
(1)空函数
如果想定义一个什么事也不做的空函数,可以用pass
语句:
1 | def nop(): |
(2)参数检查
调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出TypeError
:
1 | 1, 2) my_abs( |
但是如果参数类型不对,Python解释器就无法帮我们检查。试试my_abs
和内置函数abs
的差别:
1 | 'A') my_abs( |
当传入了不恰当的参数时,内置函数abs
会检查出参数错误,而我们定义的my_abs
没有参数检查,会导致if
语句出错,出错信息和abs
不一样。所以,这个函数定义不够完善。
让我们修改一下my_abs
的定义,对参数类型做检查,只允许整数和浮点数类型的参数。数据类型检查可以用内置函数isinstance()
实现:
1 | def my_abs(x): |
添加了参数检查后,如果传入错误的参数类型,函数就可以抛出一个错误:
1 | 'A') my_abs( |
(3)关于返回值
Python中的返回值是唯一的
Eg: 在游戏中经常需要从一个点移动到另一个点,给出坐标、位移和角度,就可以计算出新的坐标:
1 | import math |
然后,我们就可以同时获得返回值:
1 | 100, 100, 60, math.pi / 6) x, y = move( |
但其实这只是一种假象,Python函数返回的仍然是单一值:
1 | 100, 100, 60, math.pi / 6) r = move( |
原来返回值是一个tuple!但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。
3.函数的参数
Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
(1)位置参数
我们先写一个计算x2的函数
对于power(x)
函数,参数x
就是一个位置参数
修改后的power(x, n)
函数有两个参数:x
和n
,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x
和n
。
1 | def power(x, n): |
(2)默认参数
新的power(x, n)
函数定义没有问题,但是,旧的调用代码失败了,原因是我们增加了一个参数,导致旧的代码因为缺少一个参数而无法正常调用:
1 | 5) power( |
这个时候,默认参数就排上用场了。由于我们经常计算x2,所以,完全可以把第二个参数n的默认值设定为2:
1 | def power(x, n=2): |
而对于n > 2
的其他情况,就必须明确地传入n,比如power(5, 3)
。
从上面的例子可以看出,默认参数可以简化函数的调用。设置默认参数时,有几点要注意:
一是必选参数在前,默认参数在后,否则Python的解释器会报错(思考一下为什么默认参数不能放在必选参数前面);
二是如何设置默认参数。
当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
使用默认参数有什么好处?最大的好处是能降低调用函数的难度。
举个例子,我们写个一年级小学生注册的函数,需要传入name
和gender
两个参数:
1 | def enroll(name, gender): |
默认函数最大的坑:
1 | #先定义一个函数,传入一个list,添加一个END再返回: |
这是因为:
Python函数在定义的时候,默认参数L
的值就被计算出来了,即[]
,因为默认参数L
也是一个变量,它指向对象[]
,每次调用该函数,如果改变了L
的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]
了。
定义默认参数要牢记一点:默认参数必须指向不变对象!
1 | #要修改上面的例子,我们可以用None这个不变对象来实现: |
(3)可变参数
在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
我们以数学题为例子,给定一组数字a,b,c……,请计算a2 + b2 + c2 + ……。
要定义出这个函数,我们必须确定输入的参数。由于参数个数不确定,我们首先想到可以把a,b,c……作为一个list或tuple传进来,这样,函数可以定义如下:
1 | def calc(numbers): |
我们把函数的参数改为可变参数:
Python允许你在list或tuple前面加一个*
号,把list或tuple的元素变成可变参数传进去:
*nums
表示把nums
这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。
1 | #调用该函数时,可以传入任意个参数,包括0个参数: |
(4)关键字参数
- Title: Python-study
- Author: jrl
- Created at: 2023-02-24 17:10:59
- Updated at: 2023-08-07 19:02:46
- Link: https://jrl777.github.io/2023/02/24/Python-study/
- License: This work is licensed under CC BY-NC-SA 4.0.