# :-: 语言特性和基础概念
[TOC]
## 一、语言特性
### 1.程序自上而下运行
示例:
```
import time
print(5)
time.sleep(1)
print(4)
time.sleep(1)
print(3)
time.sleep(1)
print(2)
time.sleep(1)
print(1)
```
以上程序将逐行运行,每隔一秒打印一个数字,输出结果如下:
~~~
5
4
3
2
1
~~~
### 2.区分大小写
`a = 10`与 `A = 10`,生成了两个不同的变量。
### 3.全部为英文状态下的标点符号
编号语法中包括以下几种标点符号必须使用英文符号,否则会报错
- 逗号 `,`
- 括号 `( ) [ ] { }`
- 冒号 `:`
- 空格 ` `
- 分号 `;`
- *字符串里的内容不受限*
## 二、函数
函数可以简单理解为完成特定功能的一段代码,它分为两部分:
1. 调用(使用别人写好的函数的功能)
2. 定义(自己造轮子,完成特定功能,提供给自己和他人使用)
>我们初期都是在学习如何调用函数,等掌握了基础才开始尝试定义自己的函数。
这里介绍两个最常用的函数:
### 1.print()
`print('hello world')`
这句话将 `hello world` 打印了出来。
还可以同时打印多个内容,并指定分隔符和结束符号:
`print(1, 2, 3, sep='啦啦', end='#######')`
打印的内容是`1啦啦2啦啦3#######1`
### 2.input()
`input("请输入一个数字:")`
这句话将提示 `请输入一个数字:` ,并等待用户输入,输入完成后返回用户输入的内容。
- 返回的类型是字符串,后面会详细介绍。
- **用户输入的值不可控**(你可能期待用户输入一个整数,但用户可能输入的是一串文字)
- input() 由于需要等待用户输入后才继续运行,所以可以作为程序暂停的一种方式。
## 三、变量
### 1.变量的概念
> 人类语言里面,当我们提到一个人或物体, 是怎么说的?
>
> 比如说 聊天的时候,提到你的一个同学, 提到一支球队
>
> 对了,用他们的**名字**。
>
> 比如: 王晓刚同学, 湖人队等等。
>
> 如果不允许使用 事物的名字, 我们的话就没法说了。
**变量可以理解为一种容器,里面可以存放任何东西**。如果放进一个苹果,那容器里面就是苹果,如果放一只铅笔,那容器里面就是铅笔。
计算机语言中,如果产生了数据对象,却没有用容量把它们存放起来,就像这样
~~~python
16
'我爱你中国'
~~~
我们后面的代码,怎么去使用这个数字`16`和 字符串`'我爱你中国'`呢?很显然是没办法使用了。
编程语言为了方便操作数据对象,就需要使用容器存放数据对象,并给容器起一个名字。
我们把Python语言中容器的名字, 称之为**变量名**, 有时也简称**变量**。
所以Python中的变量,就是容量的名字,存放着各种数据对象。
例:
```
A = 5
A = '中国'
```
这里面 `A` 就是一个容器的名字,我们先把数字5放到`A`容器里,那`A`就代表数字5,我们再把`中国`放进`A`容器里,那`A`就代表`中国`。
### 2.变量命名
>变量用的好或不好,和代码质量有着非常重要的联系,合理的使用变量,可以让你的代码可读性更高并且更加简洁。
#### 2.1.变量命名
**1)命名的规范性**
- 变量名可以包括字母、数字、下划线,但是数字不能做为开头。
- 系统关键字不能做变量名使用,如print, input等
- 除了下划线之外,其它符号不能做为变量名使用 !
- Python的变量名是区分大小写的
**2)编程语言常用驼峰命名法**
- 大驼峰:每一个单词的首字母都大写 FirstName LastName
- 小驼峰:第一个单词以小写字母开始,后续单词的首字母大写 firstName lastName
但是在python中一般使用小驼峰加下划线的方式
```
has_error
is_person
```
#### 2.2.变量命名的描述性
在接受范围内,变量名所描述的内容越精准越好。
- BAD: day, host, cards, temp
- GOOD: day_of_week, hosts_to_reboot, expired_cards
变量名能让人猜出类型。
例如: Bool 类型
- is_user : 是否是用户
例如: int/float 类型
- port:端口号
- age:年龄
这些很直观的能让人猜出类型。
>注意: 不要使用复数来表示一个 int 类型变量,比如 apples,最好用 number_of_apples来替代。
#### 2.3.变量名尽量短,但是不要太短
- 一个好的变量名,长度应该控制在两到三个单词左右
例如,`person_index`
- 同一段代码内不要使用过于相似的变量名,比如同时出现 `users`、`users1`、 `user3`。
- 不要使用带否定含义的变量名,用 `is_special `代替 `is_not_normal`。
#### 2.4.合理使用变量
同一个变量名指代的变量类型,也需要保持一致性。
在一个函数中,一个变量名叫做 `photo`, 那么在其他地方就不要改成`image`。
#### 2.5. 变量定义尽量靠近使用
刚开始学习编程时,我们习惯把定义的变量放在开头,或一些函数最前面。如下
```
def get_name():
students = []
teachers = []
```
>***~~第3至第6小点是变量使用技巧,可以以后再回来看~~***
### 3.合理使用namedtuple/dict
Python中的函数可以返回多个值,如果某一天我们想让函数再多返回一个值怎么办呢?
```
#之前
def get_name():
return student, teacher
#现在
def get_name():
return student, teacher, parent
```
namedtuple/dict 此时可以派上用场
```
#1. 使用dict
def get_name():
return {
'student': student,
'teacher':teacher,
'parent' :parent
}
names_dict = get_name()
# 2. 使用 namedtuple
from collections import namedtuple
Names = namedtuple("Names", ['student', 'teacher', 'parent'])
def get_name():
return Names(
student = student,
teacher = teacher,
parent = parent
)
names = get_name()
```
**但是这样不能像之前一样,每一次解包多变量接受函数返回值。**
### 4. 控制单个函数内的变量数量
当某一函数过长时,或者包含太多变量时,请及时把它拆分成多个小函数。
### 5. 删除掉没用的变量
在一个函数中,如果某一个定义的变量没有被用到,请及时删除它。
### 6. 定义临时变量提高可读性
```
if student.is_active and (student.sex == 'female'):
student.add_tolist()
return
#把上面的例子变成如下
student_is_eligible = student.is_active and (student.sex == 'female')
if student_is_eligible:
student.add_tolist()
return
```
需要合理运用临时定义对象,把不必要的东西赋值成临时变量反而会让代码显得啰嗦!
## 四、代码注释
我们写的代码 为了 别人容易看懂, 甚至自己 以后能看懂, 就需要加入一些我们熟悉的**人话**,也就是人类语言,辅助理解。
这些辅助理解的人话,就是注释。
这些人话可以是任何一种语言,只要方便你看懂代码就行,中文、英文、法文都可以。
Python的注释以`#`开头,后面的内容都是注释
```
# info 变量 记录 作者的信息,包括 名字,身高,体重
info = {'name' :'不知百度知', 'height':'180cm'}
# 改变 作者的身高记录
info['height'] = '175cm'
print(info) # 打印身高到屏幕上
```
怎么样,有了上面的注释,这些代码是不是更容易读懂了?
> 我们要注意的是,通常注释是不会对代码的执行有影响的(除了一些非常特殊的注释,比如代码开头的文件编码注释,以后会讲)
基本用法:
```
# 单行注释
# 我又注释一行
# 我再注释一行
a = 10 # 行尾注释
# 下面是多行注释,适合大段文字
'''
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
'''
```
## 附:The Zen of Python (Python之禅)
最后分享一下 Zen of Python 准则。
> 在交互式解释器中输入 import this 就会显示 Tim Peters 的 The Zen of Python
| The Zen of Python, by Tim Peters | Python之禅 by Tim Peters |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| Beautiful is better than ugly. | 优美胜于丑陋(Python 以编写优美的代码为目标) |
| Explicit is better than implicit. | 明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似) |
| Simple is better than complex. | 简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现) |
| Complex is better than complicated. | 复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁) |
| Flat is better than nested. | 扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套) |
| Sparse is better than dense. | 间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题) |
| Readability counts. | 可读性很重要(优美的代码是可读的) |
| Special cases aren't special enough to break the rules.Although practicality beats purity. | 即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上) |
| Errors should never pass silently.Unless explicitly silenced. | 不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码) |
| In the face of ambiguity, refuse the temptation to guess. | 当存在多种可能,不要尝试去猜测 |
| There should be one-- and preferably only one --obvious way to do it. | 而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法) |
| Although that way may not be obvious at first unless you're Dutch. | 虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido ) |
| Now is better than never.Although never is often better than *right* now. | 做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量) |
| 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. | 如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准) |
| Namespaces are one honking great idea -- let's do more of those! | 命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召) |
- 一、Python基础
- 1. 序言
- 1.1 Python简介
- 1.2 安装和使用IDE
- 1.3 语言特性和基础概念
- 2. 基本数据类型
- 2.2 字符串型
- 2.2.2 ASCII简介
- 2.2.4 字符串常用函数
- 3. 条件分支
- 3.3 闲聊条件判断和运算符优先级
- 10.正则表达式
- 【降龙十八章】Python小技巧
- 18.1 学习网址
- 18.2 PIP切换源
- 18.3 使用whl来安装
- 【工具优化】IDE优化技巧
- Anaconda
- Jupyter Notebook 的 Markdown 添加大纲
- Jupyter Notebook中图片缩放和居左
- Anaconda设置环境变量
- Pycharm
- PyCharm新建文档配置
- 设置字体和字号
- 设置主题和字体配色
- 保存和导入配置
- 设置对选择内容自动添加引号
- 推荐安装的插件
- Markdown
- 表格格式
- 二、Python进阶
- copy和deepcopy
- 《零基础入门学习 Python 》【小甲鱼版】
- 001.和Python的第一次接触+习题复习
- 002.用Python设计的第一个游戏 +习题复习
- Pygame详解
- Pygame详解:前言
- Pygame详解(一):Color类
- Pygame详解(二):display 模块
- Pygame详解(三):draw 模块
- Pygame详解(四):event 模块
- Pygame详解(五):font 模块
- Pygame详解(六):image 模块
- Pygame详解(七):key 模块
- Pygame详解(八):locals 模块
- Pygame详解(九):mixer 模块
- Pygame详解(十):mouse 模块
- Pygame详解(十一):Rect 对象
- Pygame详解(十二):Surface 对象
- Pygame详解(十三):time 模块
- Pygame详解(十四):music 模块
- Pygame详解(十五):pygame 模块
- Pygame详解(十六):cursors 模块
- Pygame详解(十七):joystick 模块
- Pygame详解(十八):mask 模块
- Pygame详解(二十一):BufferProxy 对象
- Pygame详解(二十三):gfxdraw 模块
- Pygame详解(二十五):Overlay 对象
- Pygame详解(二十八):sndarray 模块
- Pygame详解(三十一):camera 模块
- Pygame详解(三十二):cdrom 模块
- Pygame详解(三十六):version 模块
- pygame rect相关知识
- Tkinter详解
- Tkinter 组件详解(一):Label
- Tkinter 组件详解(二):Button