第一章 用编程改造世界
1 了解编程
编程是编定程序的中文简称,就是让计算机代为解决某个问题,对某个计算体系规定一定的运算方式,使计算体系按照该计算方式运行,并最终得到相应结果的过程。
2 了解python
Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。
3 Python 特点
(1)易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。
# (2)易于阅读:Python代码定义的更清晰。
(3)易于维护:Python的成功在于它的源代码是相当容易维护的。
(4)一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好。
(5)互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断。
(6)可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台。
(7)可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用。
(8)数据库:Python提供所有主要的商业数据库的接口。
(9)GUI编程:Python支持GUI可以创建和移植到许多系统调用。
(10)可嵌入: 你可以将Python嵌入到C/C++程序,让你的程序的用户获得"脚本化"的能力。
4 python最简单的代码---Hello World
>>>print("hello world") #结果hello world
第二章 先做键盘侠
2.1 计算机会算术
1 数值运算
>>> 1+1 #加法
>>> 1-1 #减法
>>> 1*2 #乘法
>>> 1/4 #除法
>>> 1**2 #平方
>>> 1%10 #余数
2 判断表达式
>>> 1==1 # ==, 等于
>>> a=1 # =, 赋值
>>> 1 != 2 # != , 不等于
>>> 1 < 2 # < , 小于
>>> 1 > 0 # > , 大于
>>> 1 >= 0 # >= , 大于等于
3 运算优先级
乘方:**
乘除:* /
加减:+ -
判断:== > >= < <=
逻辑:! and or
2.2 计算机记性好
1 赋值
v="vivian"
print(v)
total=86000
requirement=total*(0.15+0.2)
print(requirement)
2 变量的类型
a=5
print(a) #a储存的内容为整数5
a="hello world"
print(a) #a储存的内容变成字符串"hello world"
a=100 #整型
a=100.0 #浮点型
a='abc' #字符串。也可以使用双引号"abc"标记字符串
a=true #布尔值
3 序列
example_tuple=(2,1.3,"love",5.6,9,12,false) #元组
example_list=[true,5,"smile"] #列表
type(example_tuple) #结果为'tuple'
type(example_list) #结果为'list'
example_tuple[0] #结果为2
rate={"premium":0.2,"tax":0.15} #可以用字典储存松散的数据
#example_tuple=(2,1.3,"love",5.6,9,12,false)
example_list=[5,2]
print(example_list[1])
tuple[:5] #从下标0到下标4,不包含下标5
tuple[2:] #从下标2到最后一个元素
tuple[0:5:2] #下标为0,2,4的元素
tuple[-1] #序列最后一个元素
tuple[-3] #序列倒数第三个元素
tuple[1:-1] #序列的第二个元素到倒数第二个元素'''
dict={"tom":11,"sam":57,"lily":100}
type(dict) #结果为'dict'
print(dict["tom"])
dict["tom"]=29
print(dict) ''' #如果代码过于长,可以不用返回原来字典的代码行进行修改
4 切片
(1)Python可切片对象的索引方式
包括:正索引和负索引两部分,如下图所示,以a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]为例:
(2) Python切片操作的一般方式
一个完整的切片表达式包含两个“:”,用于分隔三个参数(start_index、end_index、step),当只有一个“:”时,默认第三个参数step=1。
切片操作基本表达式:object[start_index:end_index:step]
step:正负数均可,其绝对值大小决定了切取数据时的‘‘步长”,而正负号决定了“切取方向”,正表示“从左往右”取值,负表示“从右往左”取值。当step省略时,默认为1,即从左往右以增量1取值。“切取方向非常重要!”“切取方向非常重要!”“切取方向非常重要!”,重要的事情说三遍!
start_index:表示起始索引(包含该索引本身);该参数省略时,表示从对象“端点”开始取值,至于是从“起点”还是从“终点”开始,则由step参数的正负决定,step为正从“起点”开始,为负从“终点”开始。
end_index:表示终止索引(不包含该索引本身);该参数省略时,表示一直取到数据“端点”,至于是到“起点”还是到“终点”,同样由step参数的正负决定,step为正时直到“终点”,为负时直到“起点”。
(3)彻底搞懂切片
链接:https://www.jianshu.com/p/15715d6f4dad
2.3 计算机懂选择
1 if 结构
#如果产品售价超过50,交易费率为0.1,否则为0.2。下面写一段程序
total=98
if total > 50:
print("总价超过50")
rate = 0.01
else:
print("总价不超过50")
rate = 0.02
print(rate)
2 python的缩进强制性
if i >0 :
x=1
y=2
if i >0 :
x=1
y=2 #两种不同的效果
3 if的嵌套与elif
'''i=2
if i >0: #条件1。如果条件成立则执行这部分 (条件1执行了,以下条件均不执行)print("positive i")
i=i+1
elif i >1: #条件2。不执行print("i is 0")
i=i*10
else: #条件3。不执行print("negetive i")
i=i+1
i=2
if i >0: #条件1。如果条件成立则执行这部分 (条件1执行了,以下符合条件均执行)print("positive i")
i=i+1
if i >1: #条件2。执行print("i is 0")
i=i*10
else: #条件3。不执行print("negetive i")
i=i+1
#if包含是同时打印出符合条件的结果
i=5
if i>3:
print("good")
if i>4:
print("batter")
2.4 计算机能循环
1 for 循环
for a in [1,2,3,4]
print(a) #依次打印各个元素
#for 元素 in 序列:
for i in range(5):
print("hello world") #打印5次"hello world"
2 while循环
i=0
while i < 10:
print(i)
i=i+1 #从0打到9
3 for 循环与while循环结合
x="abcfg"
while x != " ":
for c in x :
print(c,end="")
x= x[:-1]
i=0
residual=500000
interest_tuple=(0.01,0.02,0.03,0.035)
repay=30000
while residual>0:
i=i+1
print("第",i,"年要还是要还钱")
if i <=4:
interest=interest_tuple[i-1]
else:
interest=0.05
residual=residual*(interest+1)-repay
print("一共需要",i,"年")
i=0 #年份
x=500000 #还款额
t=30000 #每次还款的金额
tuple=(0.01,0.02,0.03,0.035) #元组 前四年的利率,每一年都不一样
r=0.05 #第五年开始就不变
while x>0:
i=i+1
print("第",i,"年要还是要还钱")
if i<=4:
for o in tuple: #设一个变量o
interest=o #将利率进行赋值
else:
interest=r
x=x*(1+interest)-t
print("一共需要",i+1,"年")
#两串代码结果不一样的原因分析
1.for循环的赋值是一次性赋值所有元组里面的元素,而interest[i-1]这利用切片原理很好就能达成每循环一次进行赋值一次的效果
2.print的缩进位置不对
以上种种原因导致第二串代码没有达到想要的效果
第三章 过程大于结果
1 定义函数
def square_sum(a,b):
a=a+2
b=b**2
c=a*b
return c
x=square_sum(1,2)
print(x) #结果为12
def square_sum(a,b):
a=a**2
b=b**2
c=a+b #这说明定义的函数为两个数的平方和
return c
x=square_sum(1,2)
print(x) #结果为7
def square_sum(a,b):
a=a**2
b=b**2
c=a*b #这说明定义的函数为两个数的平方积
return c
x=square_sum(1,2)
print(x) #结果12
a,b=eval(input("请输入a,b的值"))
def f(a,b):
a=a*2
b=b**2
c=a+b
return c #主要是def和return函数的作用
x=f(a,b)
print(x)
#用f替换square_sum,效果一样,说明它不是一个函数,而是自己定义的函数,所以称为定义函数
a,b=eval(input("请输入a,b的值"))
def square_sum(a,b):
a=a*2
b=b**2
c=a+b
return c
x=square_sum(a,b)
print(x)
2 调用函数
Python通过参数出现的先后位置,知道3对应的是函数定义中的第一个形参a, 4对应第二个形参b,然后把参数传递给函数square_sum()。函数square_sum()执 行内部的语句,直到得出返回值25。返回值25赋予给了变量x,最后由print()打印 出来。
3 函数文档
函数可以封装代码,实现代码的复用。对于一些频繁调用的程序,如果能写成 函数,再每次调用其功能,那么将减少重复编程的工作量。
可以看到,函数max()有两种调用方式。我们之前的调用是按照第二种方式。此 外,说明文档还说明了函数max()的基本功能。
4 参数传递
把数据用参数的形式输入到函数,被称为参数传递。如果只有一个参数,那么参数传递会变得很简单,只需把函数调用时输入唯一的一个数据对应为这个参数就可以了。如果有多个参数,那么在调用函数时,python会根据位置来确认数据对应哪个函数。例如
在调用函数时,所有的位置参数都要出现在关键字参数之前。例如
正确 错误
5 包裹传参
两次调用,尽管参数个数不同,但都基于同一个package_position()定义。 在调用package_position()时,所有的数据都根据先后顺序,收集到一个元组。 在函数内部,我们可以通过元组来读取传入的数据。这就是包裹位置传参。为了提 醒Python参数all_arguments是包裹位置传递所用的元组名,我们在定义 package_position()时要在元组名all_arguments前加*号。
与上面一个例子类似,当函数调用时,所有参数会收集到一个数据容器里。只 不过,在包裹关键字传递的时候,数据容器不再是一个元组,而是一个字典。每个 关键字形式的参数调用,都会成为字典的一个元素。参数名成为元素的键,而数据 成为元素的值。字典all_arguments收集了所有的参数,把数据传递给函数使用。 为了提醒,参数all_arguments是包裹关键字传递所用的字典,因此在 all_arguments前加**。
ps:愣是没发现它们更深层次的作用,好吧,以后会碰到它们的。。。。
6 解包裹
解包裹允许我们把一个数据容器传递给函数,再 自动地分解为各个参数。
包裹传参和解包裹并不是相反操作,而是 两个相对独立的功能。
此为解包裹
7 递归
下面我们 用编程的方法来解决高斯求和:
方法二
归纳法:数学归纳法本身非常简单。如果我们想要证明某个命题对于自然数n成立,那么:
第一步 证明命题对于n = 1成立。
第二步 假设命题对于n成立,n为任意自然数,则证明在此假设下,命题对于 n+1成立。
命题得证
想一下上面的两个步骤。它们实际上意味着,命题对于n = 1成立→命题对于n = 2成立→命题对于n = 3成立……直到无穷。因此,命题对于任意自然数都成立。 这就好像多米诺骨牌,我们确定n的倒下会导致n + 1的倒下,然后只要推倒第一块 骨牌,就能保证任意骨牌的倒下。
8 函数栈
程序中的递归需要用到栈(Stack)这一数据结构。所谓数据结构,是计算机存 储数据的组织方式。栈是数据结构的一种,可以有序地存储数据。
9 变量的作用域
函数内部可以创建新变量, 如下面的一个函数:
在一个函数内部,我们能“看到”函数 外部已经存在的变量。比如下面的程序:
主程序 和函数external_var()都有一个info变量。在函数external_var()内部,会优先 使用函数内部的那个info:
且函数内部使用的是自己内部的那一份,所以函数内部对info的操作不会影响 到外部变量info。
函数的参数与函数内部变量类似。我们可以把参数理解为函数内部的变量。在 函数调用时,会把数据赋值给这些变量。等到函数返回时,这些参数相关的变量会 被清空。但也有特例,如下面的例子:
网友评论