基本介绍
Python以语法优雅, 入门容易, 出原型快著称; 在去年,浙江省信息技术新教材已经开始采用Python做为编程学习入门语言; 在国外很多大学的计算机相关专业第一门编程语言大多数采用Python
另外在编程行业流行很广的一句话, “人生苦短,我用Python” 也从侧面证明了大家对Python的认可
由于Python受到大量程序员的爱好, 大量的程序员给Python贡献了大量有用有意思的库 很多时候我们只要一两行代码就可以完成一个很常用的功能
Python是一门很流行的语言, 在Tiobe编程语言排行榜上长期排在前5位置
Python是一门解释型语言, 脚本语言, 动态语言(跟你现在没什么关系)
开始
先来段代码感受下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import random #1, 导入其它库
answer = random.randint(0, 100) #2, 执行方法
try_times = 0 #3, 变量赋值
while True: #4, 循环
get = input() #5, 执行方法
try_times = try_times + 1 #6, 变量自增
if int(get) < answer: #7, 选择
print("Small! Guess Again. try times: %s" % try_times) #8, 打印结果
elif int(get) > answer: #9, 选择
print("Big! Guess Again. try times: %s" % try_times)
else: #10, 选择
print("bingo!!! try times: %s" % try_times)
break #11, 退出循环
上面就是一段最简单最常见的Python代码, 你可以把以上代码复制到一个文件, 比如guess_number.py(名字随意) 然后在终端中输入
1
python guess_number.py
程序就执行了, 是不是很简单
学习一门编程语言主要是学习以下两方面
语法
类库
语法是语言的固有规则, 没有道理可讲, 是不变的部分
所幸Python语法规则不多, 只用多练习就很容易记住, 所有的需求或功能都能用基本语法解决
Python已经诞生多年, 有无数优秀开发者开发出了很多优秀的模块和库, 想全部记住也是不现实的和不必的, 但记住常用的类库就行了;
类库的学习只能通过积累, 但不需刻意的去背, 在用的时候用心点记记就行, 然后多写几次自然就记得了
当遇到新需求新领域时,百度/Google下(传说中的面向搜索引擎编程)
总而言之, 编程是一门技艺, 熟能生巧; 不二法门就是多练
, 出师的标准就是养成程序思维
基本语法
下面我们再来看看上面的这段代码, 这段代码是实现了一个猜数字的游戏
首先随机产生一个0~100之间的数字
然后每回合获取玩家的输入,如果跟answer一致, 则游戏结束;
否则就给玩家一个提示, 是大了还是小了, 游戏继续
上面的程序虽然短小, 但是已经包含了Python基本语法的常用元素
- 变量及赋值 (#2, #3, #5)
- 控制结构(顺序,选择(#7,#9,#10),循环(#4))
- 关系运算(#4,#7,#9), 算术运算(#6), 逻辑运算
- 注释
- 方法(#2,#5)
- 导入其它库(#1)
只要记住以上几个元素的语法并熟练掌握, 你就能用Python做任何事;
下面我们分别来介绍
变量/常量
程序的本质就是对数据的处理, 而数据是真实存在内存中的
比如上面的游戏里, 核心的数据就是2个, 一个是生成的随机数answer; 另一个就是用户的输入get
变量就是给内存中的数据取个名字, 方便程序其它地方能随时取到这个数据
如果这个名字对应的数据是不会变化的, 就是常量; 反之就是变量
这里会引来几个问题
1 变量/常量的命名
变量的命令规则是字母和数字和下划线的组合;
虽然你可以取aaa这样的变量名编译器也认, 程序也能执行; 但是程序也是给人阅读的, 尽量要做到看名知义
一般有两种命名风格
驼峰式, 除第一个单词外,其它单词首字母大写: 如peopleName
下划线式, 所有单词小写,用下划线连接: 如total_cost
Python里推荐用下划线式
2 变量/常量的类型
在Python中数据分为以下6种类型:
Number
(数字): 有大小之分, 可进行数学运算String
(字符串, 文本): 一个名字,一句话,一段消息, 手机号码, 身份证IDList
(列表): 一类数据集合, 比如我的电子设备, 我的银行卡, 我的前女友们…Tuple
(元组): 一类数据集合, 同上; 使用小括号定义Set
(集合, 不重复): 一类数据集合, 同上; 使用大括号定义Dictionay
(字典): 最复杂,最叼的类型, can do anything
那么我们什么时候用什么类型数据呢? 每种类型都是代表具体的场景
用来表示年龄, 金钱等明显是数字类型
age = 18 #整数, int
money = 22.3 #有小数, float
当数据是文本时, 比如信息, 介绍等; 字符串用单引号或双引号或三引号包围起来
message = “Hello, 中国”
desc = ‘'’我是一个程序员, 我有改变世界的力量’’’
ID = “423122199003131234” #身份证
List, Tuple, Set三者很类似, 都是用来表达一类数据的集合
区别在于, Set里的数据是不能重复的, Tuple里的数据是不能改变的, List则无前面的限制
比如中国的省份, 应该是不能重复的, 但可能会改变(有省份会改名), 所以应该用Set
province = {‘北京’, ‘上海’, ‘广东’}
比如有个性别列表, 里面的元素应该不能改变, 所以应用Tuple
gender = (‘male’, ‘female’, ‘other’)
比如我喜欢车的牌子, 可能会重复, 可能会修改, 那用List比较合适
cars = [‘bmw’, ‘benz’, ‘porsche’, ‘Rolls-Royce’]
注意上面三种类型的定义时所用的括号类型
字典类型是用来表示复杂的数据结构的, 比如要表达一个学习各科成绩
student1 = {“name”: “cm”, “id”: 123456, “语文”: 80, “数学”: 99}
控制结构
只有三种控制结构
顺序
选择
循环
顺序是最基本的语句, 比如定义变量, 调用方法
选择语句是用在当什么情况满足/成立时就做什么事, 格式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if condition1:
# 如果条件1成立就执行这里面的代码
# 关键点有3
# 1) 每个条件后面以冒号结尾
# 2) 条件里的内容, 每行都必须缩进(在Python里冒号结尾的语句, 下一行都需要缩进)
# 3) 条件可以是任何逻辑运算的组合
elif codition2:
# 其它情况, 就执行这里的代码
# 非必须
# 可以有任意个elif, 看需要
...
elif coditionN:
# 情况N
else:
# 当以上情况都不满足时就执行这里的代码
# 非必须
循环语句是用在一直做什么事, 直到什么情况才停止, 有两种写法
1
2
3
4
5
6
for num in range(0, 10):
print num
while times < 10:
# do some thing
times = times + 1
for是用在
- 有明确的起始范围, 比如从0到10
- 把一个集合里的每个元素都遍历一次
而while是用于条件为真时, 一直执行, 直到条件不成立; 如果条件一直成立, 则无限循环
在循环体里有2种方式改变循环流程
- continue: 跳过当次循环, 执行下一个
- break: 退出循环, 剩下的都不执行了
就像上面的游戏里的代码, 猜测的过程就是一个无限循环; 猜中了就用break退出循环, 游戏结束
这3种结构中以循环最为复杂, 需要多加练习和理解领悟
另外这3种结构可以以任何组合互相嵌套, 没有任何限制, 完全看需要
比如选择语句里套循环语句, 循环语句里套选择语句
算术运算,关系运算,逻辑运算
- 算术运算 算术运算跟数学上的符号基本一样, 常见的如下
符号 | 作用 | 例子 |
---|---|---|
+ | 加法 | a+ b |
- | 减法 | a- b |
* | 乘法 | a* b |
/ | 除法,如果是整数就是整除 | a/ b |
% | 取模 | a% b |
其它比较复杂的运算, 可能在专业的科学工具库里, 比如math.sqrt
用到的时候再查
- 关系运算 用来表示两个数字之间的关系, 一般有等于,不等于, 大于,小于等, 结果只有True/False2种 常见如下;
符号 | 作用 | 例子 |
---|---|---|
> | 大于 | age > 18 |
>= | 大于等于 | age >= 18 |
= | 等于 | age = 18 |
!= | 不等于 | age != 18 |
< | 小于 | age < 18 |
<= | 小于等于 | age <= 18 |
in | 包含 | car in [‘BMW’, “BENZ’] |
not in | 不在之中 | cat not in [‘BMW’, ‘BENZ’] |
- 逻辑运算 用来表示与,或,非逻辑关系的, 结果只有True/False 2种
常见的运算有:
符号 | 作用 | 例子 |
---|---|---|
and | 与 | cond1 and cond2 (只有两边条件都为True才返回True) |
or | 或 | cond1 and cond2 (只要有一个为True就返回True) |
not | 非 | not cond1 (取反, cond1为True就返回False, cond1为False就返回True) |
注释
代码的最高境界就是不用注释, 自解释; 这是可以做到的, 也是我们写程序的追求
首先程序的思路要清晰, 不要太奇葩
再次变量,类和方法的命名要合适
套用Python作者说的Python之禅
1
2
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
如果你用了个糟糕的实现, 再多的注释也拯救不了; 所以关键是思考如果把程序写的明白
注释不是越多越好, 要用在合适的地方写合适的话
-
单行注释
-
方法注释
-
类注释
跟方法注释一样, 只是写在类名下面
1
2
3
4
5
6
7
8
9
10
# 单行注释, 以#开头
# 这是个不好的注释, 因为代码已经很简单很清晰
age = 18
def func():
"""
方法注释, 在这里添加方法的功能, 参数, 返回值
用3个双引号或单引号围起来, 放在方法定义的下面
"""
pass
方法
方法就是以功能为单位的代码块, 每个方法代表一个功能的抽象
定义方法的格式:
1
2
3
4
5
def geeting(target):
# 通过def关键字定义方法, 后面跟方法的名字, 最好能代表方法的功能
# 然后是一个括号, 括号里是参数列表, 方法需要什么参数就传什么参数进来
# 最后以一个:结尾, 然后方法的定义要缩进4格或一个Tab
print("Hello, %s" % target)
调用方法
1
2
geeting("Ljx")
# 方法名(参数1, 参数2)
或
1
2
y = sin(60)
# 结果 = 方法名(参数1, 参数2)
使用方法的好处有:
- 通过给某一此代码片段取个名字, 改变了代码结构, 方便理解和维护
- 对常用的功能, 通过抽象成方法, 提高代码复用率, 方便修改, 降低代码长度
其实编程中的方法就是参照数学里的函数来实现的
比如正弦函数sin(x), 他的功能是计算任何给定角度的正弦值
所以参数x代表的是任何角度值, 返回值是个正弦值(数字)
而方法的实现就是通过各种定理或公式来计算任意角度的正弦值
然后我们用的时候
y = sin(60)
再总结下编写方法的步骤
- 明确方法要做的事情(事情尽可能单一, 然后通过无数的小方法去完成一个大方法, 而不是直接写个大方法)
- 明确要用到哪些参数(参数尽量少, 这些参数能不能让方法实现; 如果参数可有可无就选无)
- 明确方法要不要返回值; 如果要则返回什么, 什么类型的
- 给方法取个好名字
- 按语法规则编写方法定义, 实现
- 调用方法(要不要方法的返回值, 要则定义个变量保存方法的返回值)
导入
导入的目的就是在当前Python代码中调用其它Python库的代码
调用的代码有2种情况
- 我们把自己的业务代码封装, 由更高层调用
- 为了实现业务代码, 我们需要调用一些工具(Http请求, 加密, web容器)
我们可以基于以下理由使用import功能:
1 别人已经实现了此功能, 避免重复造轮子; 比如网络请求相关的库
2 有些功能太底层或太专业, 门槛很高, 且与我们要做的事情关联不大; 比如加密算法库, 我们需要加密算法来保证我们的数据安全,但是加密算法本身的实现细节我们不需要亲自去完成(如果是学习或兴趣就另当别论)
3 抽象封装; 比如我们把业务按原子性封装成一个个类, 一个个方法, 然后由更高层来调用, 这样整个项目的代码思路就比较清晰
具体使用有两种方式
import time
from datetime import *
结束
其实上面每一个元素都可以单独写一篇文章, 可以介绍里面的各种细节, 奇淫技巧 但是我不想让文章写的那么多,
一来是怕内容太多会让初学者望而却步, 我想让读这文章的人能快速理解Python大概的样子, 学到最基本的语法, 能够用这些就能做出一个简单的东西, 然后获得信心和成就感, 进而对编程产生兴趣, 去学习更深层的东西
二来我是觉得那些细节并不是编程的核心, 都是属于雕虫小技; 相反会让人迷失在细节的魔鬼里