Python基础篇:简介

Posted 风流 少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基础篇:简介相关的知识,希望对你有一定的参考价值。

一:简介

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-index
Python是最流行的,是第一名。

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的代码量相对来说少了一些,看起来更加简洁、清爽。

以上是关于Python基础篇:简介的主要内容,如果未能解决你的问题,请参考以下文章

Python零基础到入门Python预备知识必备篇——Python简介

三僚国师:曾从政勘择长城

零基础学Python后端开发篇第二十节--Python Web开发一:Web开发简介

Python 爬虫零基础教程:简介及准备

python之小白入门起飞篇

python基础篇