廖雪峰课程 Python笔记(一)

一、学习网站

廖雪峰 Python课程:点击打开

二、补充前面知识

由于 python2.xpython3.x 不互相兼容,并且官方宣布2020年即将停止对 python2.x 的维护,所以我开始学习 python3.x 版本,这个部分主要是对之前学习的内容进行补充,新的内容会在后面更新。

1、print ()

python3.x 中,不再使用 print ... 打印内容,而是换成更直观的 print() 方法,写法依旧:

1
2
3
4
print ("hello")
print ("""line1
line2
line3""")

2、格式化

经常我们需要输出类似 "亲爱的xxx你好!你xx月的话费是xx,余额是xx" 之类的字符串,而xxx的内容都是根据变量变化的,所以,需要一种简便的格式化字符串的方式。
这里我们可以使用占位符进行操作:
格式如下:

1
"内容 + 占位符1 + 内容 + 占位符2" % (占位符对应内容值1,占位符对应内容值2)
1
2
"Hello, %s" % "world"                               # "Hello, world"
"Hi, %s, you have $%d." % ("Michael", 1000000) # "Hi, Michael, you have $1000000."
常用占位符:
1
2
3
4
%d   # 整数
%f # 浮点数
%s # 字符串
%x # 十六进制整数

3、format()

使用字符串的 format() 方法,用参数 {0}、{1}... 来替换字符串占位符,比较麻烦。

1
2
3
"Hello, {0}, 成绩提升了 {1:.1f}%".format("小明", 17.125)
# "Hello, 小明, 成绩提升了 17.1%"
# 这边的 {1:.1f} .1f表示保留小数点后一位, .2f即保留到小数点后两位, .3f ..依次类推。

4、tuple

由于 tuple(名称:元组) 一旦初始化就不能修改,没有 append() , insert() 方法,所以比较安全,如果能用 tuple 代替 list 的话尽量用 tuple

补充1:

但是有种情况可以修改 tuple 的值,就是 tuple 里面含有 list ,如下:

1
2
3
4
5
test1 = ["hi","nihao"]
test2 = ("zhe","shi","tuple",test1)
print (test2) # ("zhe","shi","tuple",["hi","nihao"])
test2[3][1] = "leo"
print (test2) # ("zhe","shi","tuple",["hi","leo])
补充2:

如果 tuple 只有 1 个元素,需要添加一个 , 都好,以免误解成数学计算意义上的符号。

1
test3 = (1,)        # (1,)

5、input() 和 raw_input()

python3.x中已经没有raw_input()!!

相同:都是用来获取控制台的输入,并且都能接收字符串。
不同:

1
2
input()      对纯数字输入,也将返回数字类型(int,float)。  
raw_input() 将所有输入作为字符串看待,并返回字符串类型。
1
2
input()      需要接收一个合法的python表达式,即输入内容需要用括号括起来,不然报错。  
raw_input() 直接读取空事态输入的任何类型的内容。

除非对 input() 有特别需求,不然一般推荐使用 raw_input() 和用户交互。
input() 需要输入 python 表达式:

1
2
3
4
5
6
7
8
a = input("input:") 
input:123 # 输入整数
type(a) #<type "int"> # 整型
a = input("input:")
input:"runoob" # 正确,字符串表达式
type(a) # <type "str"> # 字符串
a = input("input:")
input:runoob # 报错,不是表达式 ...NameError: name "runoob" is not defined <type "str">

raw_input() 将所有输入作为字符串看待:

1
2
3
4
5
6
a = raw_input("input:")
input:123
type(a) # <type "str"> # 字符串
a = raw_input("input:")
input:runoob
type(a) # <type "str"> # 字符串

6、循环

补充a、break,退出循环
1
2
3
4
5
6
n = 1while n <= 100:
if n > 10: # 当n = 11时,条件满足,执行break语句
break # break语句会结束当前循环
print(n)
n = n + 1
print("END")
补充b、continue,跳过这次循环
1
2
3
4
5
6
n = 0
while n < 10:
n = n + 1
if n % 2 == 0: # 如果n是偶数,执行continue语句
continue # continue语句会直接继续下一轮循环,后续的print()语句不会执行
print(n)

循环是让计算机做重复任务的有效的方法。
break语句 可以在循环过程中直接退出循环,而 continue语句 可以提前结束本轮循环,并直接开始下一轮循环。这两个语句通常都必须配合if语句使用。

注意,不要滥用 breakcontinue 语句。 breakcontinue 会造成代码执行逻辑分叉过多,容易出错。
大多数循环并不需要用到 breakcontinue 语句,上面的两个例子,都可以通过改写循环条件或者修改循环逻辑,去掉 breakcontinue 语句。

7、关于数值类型的补充

a、整数类型:

python3.x 中,只要内存允许,整型数据的值可以拓展到 任意长度 ,整数取值范围几乎包括全部整数,这给 大数据的计算 带来便利。

b、实型数据:

实型也称 浮点型 ,Python语言中,实数只采用十进制。它有两种表示形式: 十进制形式指数形式

十进制数形式由数码0~9和小数点组成,如345.0、12.2、0.0等。实型数据允许小数点后面没有任何数字,表示小数部分为0,如23.表示23.0。

指数形式即由科学计数法表示的浮点数,由十进制数加阶码标志E或e组成。e之前为数字部分,之后为指数部分,且两部分必须同时出现,指数必须为整数。如45e-5,9.34e2等,分别代表45x10-5、9.34x102,而e4,3.4e3.4、34e等是非法的浮点型常量。

c、复合型数据:

科学计算中经常遇到 复数 运算问题,如数学中求方程的复根,电工学中交流电路的计算等都用到复数运算。
python提供了 复数类型 ,形式为 a+bj ,其中 a是复数的实部b是虚部j表示-1的平方根 (虚数单位)。代码:

1
2
x = 12 +34 j
x # (12 + 34j)

通过 x.realx.imag 来分别获取复数x的实部和虚部,结果都是 浮点型

1
2
x.real           # 12.0
x.imag # 34.0

8、数据类型转换 和 最值

Python内置的常用函数还包括 数据类型转换函数,比如 int()函数 可以把其他数据类型转换为 整数

1
2
3
4
5
6
7
int("123")       # 123
int(12.34) # 12
float("12.34") # 12.34
str(1.23) # "1.23"
str(100) # "100"
bool(1) # True
bool("") # False

函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个 “别名”

1
2
a = abs          # 变量a指向abs函数
a(-1) # 1 所以也可以通过a调用abs函数

max函数 max() 可以接收任意多个参数,并返回最大的那个:

1
2
max(1, 2)        # 2
max(2, 3, 1, -5) # 3

9、空函数 pass语句

空函数实际上什么也不做,一般用来作为 占位符 ,比如现在没想好写什么内容,可以先写个 pass 让代码运行起来:

1
2
def nop():
pass

还可以放在其他语句中:

1
2
if age >= 18:
pass

10、python运算符

运算符详细介绍:点击查看
^ 异或运算 比如,

1
2
3
4
1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1
0 ^ 1 = 1

11、默认参数的补充

可以不按照顺序传递参数:

1
2
3
4
5
6
7
def f1(a,b,c="5",d=""):
print("这是a",a)
print("这是b",b)
print("这是c",c)
print("这是d",d)
print(f1(1,2,3,5))
print (f1(1,3,d="666")

定义默认参数要牢记一点:默认参数必须指向不变对象

12、可变参数的补充

在参数前面加了一个 * 号。

1
2
3
4
5
6
def f1(a,b,*list):
print (a,b,list)
print (list[0][0])
print (list[0][1])
print (list[0][2])
f1(1,2,[3,4,5])

13、关键字参数的补充

关键字参数允许你传入 0个 或者任意个 参数名的参数,这些关键字参数在函数内部会自动组装成一个 dict

1
2
3
4
5
6
def person(name, age, **kw):
print("name:", name, "age:", age, "other:", kw)
person("Bob", 35, city="Beijing")
# name: Bob age: 35 other: {"city": "Beijing"}
person("Adam", 45, gender="M", job="Engineer")
# name: Adam age: 45 other: {"gender": "M", "job": "Engineer"}

**extra 表示把 extra 这个 dict 的所有 key-value 用关键字参数传入到函数的 **kw 参数, kw 将获得一个 dict ,注意 kw 获得的 dictextra 的一份拷贝,对 kw 的改动不会影响到函数外的 extra

1
2
3
extra = {"city": "Beijing", "job": "Engineer"}
person("Jack", 24, **extra)
# name: Jack age: 24 other: {"city": "Beijing", "job": "Engineer"}

14、迭代的补充

for ... in循环:
多个变量迭代 keyvalue:

1
2
3
4
5
6
7
8
9
10
11
d = {"x": "A", "y": "B", "z": "C" }

# 迭代方法1:
for k, v in d.items():
print(k, "=", v)

# 迭代方法2:
[k + "=" + v for k, v in d.items()]
# y = B
# x = A
# z = C

15、生成器的补充

第一种方法很简单,只要把一个列表生成式的 [] 改成 ()

1
2
3
4
5
6
7
L = [x * x for x in range(10)]
L # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
g = (x * x for x in range(10))
g # <generator object <genexpr> at 0x1022ef630>
h = (x * x for x in range(10))
for n in h:
print(n)