Python学习(1) - 基本语法

Posted by Mingo's Blog on 2018-04-16 00:00

基本介绍

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(字符串, 文本): 一个名字,一句话,一段消息, 手机号码, 身份证ID
  • List(列表): 一类数据集合, 比如我的电子设备, 我的银行卡, 我的前女友们…
  • 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是用在

  1. 有明确的起始范围, 比如从0到10
  2. 把一个集合里的每个元素都遍历一次

而while是用于条件为真时, 一直执行, 直到条件不成立; 如果条件一直成立, 则无限循环

在循环体里有2种方式改变循环流程

  1. continue: 跳过当次循环, 执行下一个
  2. 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. 类注释

跟方法注释一样, 只是写在类名下面

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)

再总结下编写方法的步骤

  1. 明确方法要做的事情(事情尽可能单一, 然后通过无数的小方法去完成一个大方法, 而不是直接写个大方法)
  2. 明确要用到哪些参数(参数尽量少, 这些参数能不能让方法实现; 如果参数可有可无就选无)
  3. 明确方法要不要返回值; 如果要则返回什么, 什么类型的
  4. 给方法取个好名字
  5. 按语法规则编写方法定义, 实现
  6. 调用方法(要不要方法的返回值, 要则定义个变量保存方法的返回值)

导入

导入的目的就是在当前Python代码中调用其它Python库的代码

调用的代码有2种情况

  • 我们把自己的业务代码封装, 由更高层调用
  • 为了实现业务代码, 我们需要调用一些工具(Http请求, 加密, web容器)

我们可以基于以下理由使用import功能:

1 别人已经实现了此功能, 避免重复造轮子; 比如网络请求相关的库

2 有些功能太底层或太专业, 门槛很高, 且与我们要做的事情关联不大; 比如加密算法库, 我们需要加密算法来保证我们的数据安全,但是加密算法本身的实现细节我们不需要亲自去完成(如果是学习或兴趣就另当别论)

3 抽象封装; 比如我们把业务按原子性封装成一个个类, 一个个方法, 然后由更高层来调用, 这样整个项目的代码思路就比较清晰

具体使用有两种方式

import time

from datetime import *

结束

其实上面每一个元素都可以单独写一篇文章, 可以介绍里面的各种细节, 奇淫技巧 但是我不想让文章写的那么多,

一来是怕内容太多会让初学者望而却步, 我想让读这文章的人能快速理解Python大概的样子, 学到最基本的语法, 能够用这些就能做出一个简单的东西, 然后获得信心和成就感, 进而对编程产生兴趣, 去学习更深层的东西

二来我是觉得那些细节并不是编程的核心, 都是属于雕虫小技; 相反会让人迷失在细节的魔鬼里

参考