由于学习、工作等原因,差不多一年过后,自己重新开启了博客的书写之路。这里整理和记录了自己的每天点滴学习、思考等相关内容。自己最近重新看了廖雪峰老师的Python教程(网址为:https://www.liaoxuefeng.com/wiki/1016959663602400),系统地回顾了Python语言的相关内容,并将以小结的内容形式进行展示。首先,将下面的几部分内容作为学习小结一的内容。内容中涉及的程序均来源于廖老师的Python教程(网址为https://www.liaoxuefeng.com/wiki/1016959663602400/)。
一、Python简介
Python:运行速度慢;
不能加密代码;
命令行环境和交互环境;
Cpython和IPython的解释器;
exit()退出交互环境,用python xxx.py在命令行模式下执行python程序;
python代码运行助手:在线编辑代码执行出结果;
边编译边执行。
文本编辑器:Sublime和Notepad++。
二、Python程序
1. 输入和输出
输入:input() 获得的结果是str类型的,可以用类似的int()等来强制转换为对应的类型。
输出:print()。
缩进应严格遵守“4个空格”的限制。可以在文本编辑器中进行设置,保证Tab被设置为“4个空格”。
2. 数据类型
整型;
浮点型(1.23*10^9用1.23e9表示,0.000012用1.2e-5表示),整型和浮点型都没有大小限制;
字符串:用’ ’或” ”都可以,用\x实现字符x的转义,用’’’...’’’表示多行内容;
布尔型:True和False,支持and、or和not运算;
空值:用None表示(None不是0)。
3. 变量和常量
变量:字母、数字和_的结合,但是不能以数字开头。
常量:用大写的变量名表示。
静态语言:在定义变量时必须指明变量的类型;动态语言:在定义时没有指定类型。
除法:/的结果是浮点数,对/左右两侧的数据是整数还是浮点数无关,//的结果是整数(如14//3的结果是4,4//3的结果是1)。
求余:%结果是整数,和C中的用法是一样的。
4. 字符串编码
ASCII只能表示127个字符,用一个字节表示。
Unicode用两个字节表示。
从节省存储空间的角度出发,引入UTF-8,是“可变长编码”,用1~6个字节表示。
在计算机内存中都是以Unicode编码的形式进行存储的,在保存到硬盘或者需要传输时 以UTF-8的形式进行传输。
浏览网页时服务器是将Unicode内容转变为UTF-8再传输到浏览器的。
在Python3中,字符串是以Unicode的形式进行编码的。对于单个的字符,Python提供了ord()获取字符的整数表示,chr()把编码转变为字符。
把Unicode表示的字符转变为以字节为单位的bytes:encode()方法。反之,用decode()。
len(x):统计字符串x中有的字符的个数。
python的源代码包括中文时,要将其转变为UTF-8编码。使得Python解释器在读取代码时是按照UTF-8编码读取的。为此,我们通常在文件开头写上:
#!/usr/bin/env python3#
-*- coding: utf-8 -*-
第一行:告诉Linux/Mac OS X系统,这是一个Python可执行程序,Windows系统会忽视这个注释。
第二行:告诉Python解释器,应该按照UFT-8编码的形式读取源代码。申明了UTF-8编码并不意味着你的.py文件就是UTF-8编码的,必须并且要确保文本编辑器正在使用UTF-8 without BOM编码。
5. 格式化
(1)%实现格式化
例如:print('%2d-%02d' % (3, 1)) 结果是:
3-01
print('%d-%02d' % (3, 1)) 结果是:
3-01
(2)另一种格式化的方式是使用format()方法,但是比较麻烦!
6. list和tuple
(1)list
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']
访问元素:从0开始,如classmates[0]。
用classmates[-1]可以直接获得最后一个元素,类似的用classmates[-2]获得倒数第二个元素。
追加元素到末尾:classmates.append(‘Adam’)。
把元素插入到指定的位置上:classmates.insert(1, ‘Jack’),即将’Jack’插入到下标为1的位置上。
删除末尾的元素:classmates.pop()。
删除指定位置的元素:classmates.pop(1),即删除下标为1的元素。
把某个位置的元素替换为其它的元素:如classmates[1]=’Search’。
list中也可以包括其它的list,如:
>>> s = ['python', 'java', ['asp', 'php'], 'scheme']
>>> len(s)
4
按照s[2][1]可以得到’asp’。
list中也可以没有元素:s=[],则len(s)的结果是0。
(2)tuple
相比list,元素是不能被修改的。从而,确保了数值的安全。
定义如下所示:
>>> classmates = ('Michael', 'Bob', 'Tracy')
和list一样,按照classmates[-1],classmates[0]获取元素。
定义空tuple:s=()。
定义只有一个元素的tuple,如s=(1,),即()中元素的后面应该有”,”。tuple里面是可以有元素是list的,这并不违背不变的原则,获取其中的元素的方式和list是一致的。
7. 条件判断
if 判断1:
语句1
elif 判断2:
语句2
...
else
语句n
8. 循环 (注意例子中的蓝色语句)
(1)for循环
sum = 0
for x in range(101):
sum = sum + x
print(sum)
结果是:5050。
(2)while循环
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
break和continue:break提前结束循环,continue提前结束本次循环。
不要滥用break和continue!
9. dict和set
(1)dict
dict:键-值对。
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
采用dict可以确保查询速度。和list、tuple对比,查询速度并不会随着长度的增加而变慢。但是,需要占用较大的内容。因而,相比之前的数据结构,实际上用空间来换取时间!
增加元素和重新赋值:
>>> d['Jack'] = 90
>>> d['Jack']
90
>>> d['Jack'] = 88
>>> d['Jack']
88
删除字典中的元素:d.pop(‘Bob’)。
查询key是否存在,不存在的话返回自己指定的数值:d.get(‘Thomas’, -1),不存在的话将返回默认值-1;如果不写-1的话,即d.get(‘Thomas’),则不存在的话会范围None。
dict中的key不是可变对象,因而常用str作为key。
(2)set
定义set时,需要提供一个list作为输入。set中是没有重复元素的。
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
增加元素:a=s.add(4)
移除元素:a=s.remove(4)
集合的交集:s1 & s2
集合的并集:s1 | s2
和dict一样,元素不能是可变对象。
三、函数
1. Python有很多内置函数:如abs(),max()(max的参数可以是很多个,从中找出最大的那个数值),int(),float(),str(),bool()。
函数其实就是抽象的具体表现形式!
2. 函数的定义
(1)空函数
def nop():
pass
pass还可以用在if判断等情况下,它什么也不做,只是起一个占位符的作用。如果没有pass的话,则会出错。
(2)函数返回多个值
import math
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
调用函数:
>>> x, y = move(100, 100, 60, math.pi / 6)
>>> print(x, y)
151.96152422706632 70.0
>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)
注:函数体中用return返回结果。如果没有return的话,则会返回None(如上所示,print(r)的结果是None)。
函数可以同时返回多个结果,结果以tuple的形式输出。
3. 函数的参数
(1)默认参数
如2中所示的angle=0。
将选择的参数放在前面,将默认参数放在最后!使用默认参数后,可以使得函数可以适用于复杂的调用和简单的调用。
既可以按照默认顺序提供参数,又可以不按顺序提供,此时需要将参数名写上。如:enroll('Adam', 'M', city='Tianjin')。
默认参数必须是指向不变对象。否则,容易出错。
(2)可变参数
例如:
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
可以传入0个参数,即cal(),结果是0。参数numbers接收的是一个Tuple。若传入的是list,则可以:
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
(3)关键字参数
允许传入0个或任意多个含有参数名的参数。将会自动组装成一个dict。例如:
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
使用关键字参数可以扩展函数的功能。
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
在函数内部对于kw的修改不会影响extra。
(4)命名关键字参数
若要限制关键字参数的参数名字,则需要使用命名关键字参数。
def person(name, age, *, city, job):
print(name, age, city, job)
*后面表示参数的名称。一定要有*,否则会认为所有的参数都是必要参数。如果,参数列表中已经有可变参数了,就不用写*。如下所示:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
(5)在参数列表中的参数的位置顺序
必要参数,默认参数,可变长参数,命名关键字参数,关键字参数
(6)总结
默认参数应该是指向不变的对象。
*args参数实际上是一个tuple。
**kw参数实际上是一个dict。
命名关键字参数不要忘记写*。
4. 递归函数
优点:易懂。
缺点:递归过深会导致栈溢出。
改进:采用尾递归(对于不支持循环的编程语言是一种好的选择。对于Python而言,由于解释器没有对尾递归进行优化,因而仍会导致栈溢出)。