一:简介
1.1 简介
Python是一种用C语言
编写的、现代化
、弱类型
(在声明变量时不需要显式指定数据类型) 、脚本语言
(解释执行
:运行一句,解析一句,而不是编译执行,所以速度相对较慢)、动态语言
(在程序运行时给对象绑定新的属性和方法),其特点是语法简洁
、优雅、入门简单、应用场景广泛。
- 语法简洁是指语法上能省则省:
- 省掉语句结束的分号;
- 省掉代码块开始和结束的大括号{}
- 省掉if语句的小括号()
- 省掉元组中的小括号()
- 省掉声明变量的关键字
- 省掉变量的数据量类型
- 省掉方法声明的参数的数据类型,省掉方法的返回值声明。
- 省掉访问作用域(private、public)等。
- 创建对象省略new关键字。
- 抽象类不用abstract关键字修饰,抽象类就是接口。
- Python中构造器方法__init__不支持方法重载,一个初始化方法列举出来所有属性,给每个属性赋一个默认值None,然后通过关键字参数代替任意的参数的组合。
1.2 Python设计哲学
- 优美胜于丑陋。
- 明了胜于晦涩。
- 简洁胜于复杂,复杂胜于凌乱。
- 扁平胜于嵌套。
- 宽松胜于紧凑。
- 可读性很重要。
- 不要捕获所有错误,除非你确定需要这样做。
- 如果存在多种可能,不要猜测,通常只有唯一一种最佳的解决方案。
-
约定大于语法限制
。如常量就是名字全部大写的变量,通过约定表示常量,而不是通过语法去强制表示。 -
不占用常用的名字
,如 init、file等,Python自己的内置都会在前后各使用两个下划线来做区别,如__init__、__file__等。 - 使用魔法方法来代替接口,例如实现了魔法方法__iter__、__next__就相当于Java中实现了迭代器接口。
1.3 Python解释器的种类
-
CPython
:使用C语言编写的,Python官方提供的,默认是这种。 - PyPy:使用Python编写的,比CPython快,但是兼容性不如CPython。
- Jython:基于Java编写的Python环境,可以将Python代码编译为Java字节码,在Java虚拟机下运行。
- IronPython:基于.NET平台实现的Python的环境,可以兼容.NET Framework 链接库。
1.4 PyCharm编译环境
- Virtualenv:虚拟编译环境,依赖库会保存到当前项目下面。
- Pipenv: pipenv = pip + Virtualenv,是对Virtualenv的改进版本。
- Conda:是一个开源的软件包管理系统和环境管理系统。需要单独安装Anaconda软件。用于进行大规模数据处理,预测分析和科学计算,致力于简化包的管理和部署。
1.5 Python官方文档
Python官方中文文档: https://docs.python.org/zh-cn/3/
二:应用场景
2.1 应用场景
- 大数据:pyhive、pyflink、pyspark
- 网路爬虫:Scrapy、BeautifulSoup
- 人工智能:TransorFlow、PyTorch、Karas
- 自动化测试:Selenium
- 自动化运维:使用Python代替Shell脚本,在可读性、扩展性、重用性都要优于Shell脚本。
- 科学计算:NumPy、SciPy、Matplotlib、pandas
- Web应用开发:Django、Flask,豆瓣和知乎就是使用Python开发的。
- GUI桌面应用开发:Tkinter、PyQT、PySide、wxPython、PyGTK 等。
- 数据库可视化:Matplotlib
- 机器学习
- 游戏开发:Pygame、Pyglet、Cocos2d
2.2 受欢迎程度和运行效率
2.2.1 Python是最流行的
TIOBE开发语言流行排行榜 https://www.tiobe.com/tiobe-indexPython是最流行的,是第一名。
2.2.2 Python是性能最差的
开发语言性能排行榜中Python是最后一名,是运行效率最差的。
2.3 为什么Python的运行效率最差却是最受欢迎的???
- Python的很多应用场景基本上都是单用户程序,如爬虫、大数据、自动化测试 Selenium、GUI桌面软件等等基本上都是单用户程序。Python不像Java语言一样通常作为服务器程序,同一时间内有多个用户同时访问。既然是单用户程序自然也用太关系运行效率,虽然Python运行效率在所有语言中最低的,但是相对于人来说那还是快的不在一个等级上,Python运行效率最差是相对于其它编程语言而不是相对于人,所以Python的速度是人类可以接受的,再说Python的应用场景通常都是单用户,综上Python的运行效率就变的没那么重要。
- Python封装程度更高,也就是说实现相同的功能,Python可能只需要几行代码,而如果用C语言开发可能要几十行、几百行代码,代码少了,也就意味着开发出一个相同的功能所需要的时间更短,也就是Python的
开发效率非常非常高
(老板喜欢开发速度快的)。例如使用Python做爬虫、做自动化代码量非常少。 - Python中有些应用场景是属于工具类的,也是一种单用户应用。
- Python可以调用C、C++库。
- Python库多,
生态丰富
。 - Python
适用人群范围广
,不止是职业程序员,Python被作为小学生课程。 - 人生苦短,我用Python。
三:语法简洁
Python是一种现代化编程语言,既然是现代化,那就要有新的语法优化。
3.1 声明变量不需要关键字和数据类型
3.2 不需要在语句最后写;
// java
String name = "张三";
// javascript
var name = "张三"
# python
name = "张三"
3.3 方法的入参不需要写数据类型,不需要指定返回值类型, 也不需要使用{}来指定方法体
老语言都是使用一对 {}来表示方法体的开始和结束,而Python使用冒号:表示方法体的开始,使用缩进(一个Tab)表示方法体。
// java
public int add(int x, int y) {
return x + y;
}
// python
def add(x, y):
return x + y;
3.4 支持负索引、负步长
同样是获取最后一个元素,python由于支持负索引代码量就很少,看起来很简洁。
// java
List<String> names = Arrays.asList("a", "b", "c");
System.out.println(names.get(names.size() - 1));
# python
names = ['a', 'b', 'c']
print(names[-1])
# 字符串反转
foobar = 'foobar'
print(foobar[::-1])
3.5 判空
以下值做为bool值都视为False:
- False
- 字符串为空 “”
- 元组为空 ()
- 列表为空 []
- Set集合为空 set()
- 整型 0
- 浮点型 0.0
- 复数 0j
- None
java还需要使用工具方法来判断值是否为空,而Python直接判断变量就行了。
String foobar = "foobar";
if (StringUtils.isNotBlank(foobar)) {
int length = foobar.length();
}
// python
foobar = "foobar"
if foobar:
length = len(foobar)
3.6 全局变量
python在if、try 等代码块中定义的变量竟是全局变量,这样try中定义的变量可以直接在finally中直接使用,而像其它java语言就必须把全局变量放在外边,这样一来代码就多了一行,这也是python精简的一个提现。
try:
foobar = 'this is global variable'
except ValueError as e:
print(foobar)
3.7 私有属性或方法用__表示
在其它语言中私有作用域一般是用关键字private
来表示,而Python是在属性名或者方法名的前面使用两个下划线来__
表示。这在代码上看起来更加精简,这也是Python代码简洁的一个提现。
class User:
id = None
name = None
__password = None
def __get_password(self):
return self.__password
user = User()
# AttributeError: 'User' object has no attribute '__password'
# print(user.__password)
# AttributeError: 'User' object has no attribute '__get_password'
user.__get_password()
3.7 读取文件
TextIOWrapper 实现了迭代器可以直接使用for循环读取文件,像java语言要读取文件还需要将File包装成InputStream等,确实Python的写法更加的优雅简洁。
f = open('a.txt')
for line in f:
print(line)
except Exceptlon as e:
pass
try(
InputStreamReader isr = new InputStreamReader(new FileInputStream(new File("xxx.txt")));
BufferedReader reader = new BufferedReader(isr)) {
String line;
while( (line= reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
}
3.8 创建对象不使用new关键字
// java创建对象使用new关键字
User user = new User();
# 很多编程语言创建对象都使用关键字new
user = User()
3.9 抽象类
Python中的抽象类不需要关键字修饰,只要方法中没有方法体,使用pass来占位,那么这个方法就是抽象类。Python中也没有接口,抽象类就是接口。这也是Python简化代码的一个重要提现。
# 抽象类或者接口
class Animal:
def sound(self):
pass
class Dog(Animal):
def sound(self):
print('旺旺')
class Cat(Animal):
def sound(self):
print('喵喵')
def say_hello(animal: Animal):
animal.sound()
cat = Cat()
say_hello(cat)
dog = Dog()
say_hello(dog)
3.10 赋予了运算符更多的功能
在Python中可以使用比较运算符对两个对象比较大小,使用 + 号等运算符操作列表,这使得代码非常简洁。
user1 = User()
user2 = User()
print(user1 <= user2)
print([1, 2, 3] + [4, 5, 6])
3.11 缩写命名习惯
- java推荐完整单词命名,即整个单词都完整拼写,如获取字符串长度,length()
- ptyhon推荐缩写单词,即只写单词的一部分,如获取字符串长度 len()
3.12 嵌套函数(闭包)
java不支持嵌套函数,而Python支持嵌套函数(闭包),闭包:双层嵌套寒素,内层函数可以访问外层函数的变量,外层函数的返回值为内层函数名。内部函数如果想修改外部函数的变量可以通过关键字nonlocal
来修饰。
demo.py
name = '狗哥'
def outer(msg):
global name
print(f'{name}:{msg}')
# 狗哥:我怕打死你
outer("我怕打死你")
# 狗哥:我先绑上一直胳膊
outer("我先绑上一直胳膊")
def outer(name):
print(name)
def inner(msg):
print(f'{name}:{msg}')
return inner
# 狗哥
foo = outer("狗哥")
# 狗哥:我怕打死你
foo("我怕打死你")
# 狗哥:我先绑上一直胳膊
foo("我先绑上一直胳膊")
两段程序功能是相同的,第一个片段更简洁,但是name是全局变量,全局变量也就意味着当前.py文件被别的文件导入时可以被访问,被访问意味着可能会被修改,被修改意味着很不安全。
import demo
demo.name = '虚竹'
# 虚竹:国师使用的不是拈花指
demo.outer('国师使用的不是拈花指')
而闭包就是为了解决全局变量引发的安全问题,通过闭包(函数嵌套函数)可以把全局变量的作用域限制到第一个函数的内部,这样其它python文件想再访问全局变量就访问不了了,因为全局变量已经变成函数内部的变量了。
闭包优缺点
优点
- 无需定义全局变量即可实现通过函数,持续的访问。修改某个值。
- 闭包使用的变量的所用于在函数内,难以被错误的调用修改。
缺点
- 由于内部函数持续引用外部函数的值,所以会到这这一部分内存空间不被释放,一直占用内存。
3.12 其它
Python在老语言的基础上增加很多新的语法,对老的语法也进行简化,这使得在完成相同的功能上Python的代码量相对来说少了一些,看起来更加简洁、清爽。