Python基础与应用

Posted

tags:

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

1.python简介

Python是著名的龟叔”Guido van Rossum1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。

现在,全世界差不多有600多种编程语言,但流行的编程语言也就那么20来种。如果你听说过TIOBE排行榜,你就能知道编程语言的大致流行程度。这是最近10年最常用的10种编程语言的变化图:

技术分享

 

总的来说,这几种编程语言各有千秋。C语言是可以用来编写操作系统的贴近硬件的语言,所以,C语言适合开发那些追求运行速度、充分发挥硬件性能的程序。而Python是用来编写应用程序的高级编程语言。

当你用一种语言开始作真正的软件开发时,你除了编写代码外,还需要很多基本的已经写好的现成的东西,来帮助你加快开发进度。比如说,要编写一个电子邮件客户端,如果先从最底层开始编写网络协议相关的代码,那估计一年半载也开发不出来。高级编程语言通常都会提供一个比较完善的基础代码库,让你能直接调用,比如,针对电子邮件协议的SMTP库,针对桌面环境的GUI库,在这些已有的代码库的基础上开发,一个电子邮件客户端几天就能开发出来。

Python就为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作内置电池(batteries included。用Python开发,许多功能不必从零编写,直接使用现成的即可。

除了内置的库外,Python还有大量的第三方库,也就是别人开发的,供你直接使用的东西。当然,如果你开发的代码通过很好的封装,也可以作为第三方库给别人使用。

许多大型网站就是用Python开发的,例如YouTubeInstagram,还有国内的豆瓣。很多大公司,包括GoogleYahoo等,甚至NASA(美国航空航天局)都大量地使用Python

龟叔给Python的定位是优雅明确简单,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。

总的来说,Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码。如果一个资深程序员向你炫耀他写的晦涩难懂、动不动就几万行的代码,你可以尽情地嘲笑他。

Python适合开发哪些类型的应用呢?

首选是网络应用,包括网站、后台服务等等;

其次是许多日常需要的小工具,包括系统管理员需要的脚本任务等等;

另外就是把其他语言开发的程序再包装起来,方便使用。

最后说说Python的缺点。

任何编程语言都有缺点,Python也不例外。优点说过了,那Python有哪些缺点呢?

第一个缺点就是运行速度慢,和C程序相比非常慢,因为Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是运行前直接编译成CPU能执行的机器码,所以非常快。

但是大量的应用程序不需要这么快的运行速度,因为用户根本感觉不出来。例如开发一个下载MP3的网络应用程序,C程序的运行时间需要0.001秒,而Python程序的运行时间需要0.1秒,慢了100倍,但由于网络更慢,需要等待1秒,你想,用户能感觉到1.001秒和1.1秒的区别吗?这就好比F1赛车和普通的出租车在北京三环路上行驶的道理一样,虽然F1赛车理论时速高达400公里,但由于三环路堵车的时速只有20公里,因此,作为乘客,你感觉的时速永远是20公里。

 

第二个缺点就是代码不能加密。如果要发布你的Python程序,实际上就是发布源代码,这一点跟C语言不同,C语言不用发布源代码,只需要把编译后的机器码(也就是你在Windows上常见的xxx.exe文件)发布出去。要从机器码反推出C代码是不可能的,所以,凡是编译型的语言,都没有这个问题,而解释型的语言,则必须把源码发布出去。

这个缺点仅限于你要编写的软件需要卖给别人挣钱的时候。好消息是目前的互联网时代,靠卖软件授权的商业模式越来越少了,靠网站和移动应用卖服务的模式越来越多了,后一种模式不需要把源码给别人。

再说了,现在如火如荼的开源运动和互联网自由开放的精神是一致的,互联网上有无数非常优秀的像Linux一样的开源代码,我们千万不要高估自己写的代码真的有非常大的商业价值。那些大公司的代码不愿意开放的更重要的原因是代码写得太烂了,一旦开源,就没人敢用他们的产品了。

2.输入与输出

输出

print()在括号中加上字符串,就可以向屏幕上输出指定的文字。比如输出‘hello, world‘,用代码实现如下:

技术分享

 

print()函数也可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出:

技术分享

 

print()会依次打印每个字符串,遇到逗号“,”会输出一个空格,因此,输出的字符串是这样拼起来的:

 技术分享

 

print()也可以打印整数,或者计算结果:

>>> print(300)300>>> print(100 + 200)300

因此,我们可以把计算100 + 200的结果打印得更漂亮一点:

>>> print(‘100 + 200 =‘, 100 + 200)100 + 200 = 300

注意,对于100 + 200Python解释器自动计算出结果300,但是,‘100 + 200 =‘是字符串而非数学公式,Python把它视为字符串,请自行解释上述打印结果。

输入

现在,你已经可以用print()输出你想要的结果了。但是,如果要让用户从电脑输入一些字符怎么办?Python提供了一个input(),可以让用户输入字符串,并存放到一个变量里。比如输入用户的名字:

>>> name = input()

Michael

当你输入name = input()并按下回车后,Python交互式命令行就在等待你的输入了。这时,你可以输入任意字符,然后按回车后完成输入。

输入完成后,不会有任何提示,Python交互式命令行又回到>>>状态了。那我们刚才输入的内容到哪去了?答案是存放到name变量里了。可以直接输入name查看变量内容:

>>> name‘Michael‘

什么是变量?请回忆初中数学所学的代数基础知识:

设正方形的边长为a,则正方形的面积为a x a。把边长a看做一个变量,我们就可以根据a的值计算正方形的面积,比如:

a=2,则面积为a x a = 2 x 2 = 4

a=3.5,则面积为a x a = 3.5 x 3.5 = 12.25

在计算机程序中,变量不仅可以为整数或浮点数,还可以是字符串,因此,name作为一个变量就是一个字符串。

要打印出name变量的内容,除了直接写name然后按回车外,还可以用print()函数:

>>> print(name)

Michael

有了输入和输出,我们就可以把上次打印‘hello, world‘的程序改成有点意义的程序了:

name = input()print(‘hello,‘, name)

运行上面的程序,第一行代码会让用户输入任意字符作为自己的名字,然后存入name变量中;第二行代码会根据用户的名字向用户说hello,比如输入Michael

C:\\Workspace> python hello.py

Michael

hello, Michael

但是程序运行的时候,没有任何提示信息告诉用户:嘿,赶紧输入你的名字,这样显得很不友好。幸好,input()可以让你显示一个字符串来提示用户,于是我们把代码改成:

name = input(‘please enter your name: ‘)print(‘hello,‘, name)

再次运行这个程序,你会发现,程序一运行,会首先打印出please enter your name:,这样,用户就可以根据提示,输入名字后,得到hello, xxx的输出:

C:\\Workspace> python hello.py

please enter your name: Michael

hello, Michael

每次运行该程序,根据用户输入的不同,输出结果也会不同。

在命令行下,输入和输出就是这么简单。

  1. 数据类型

计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值。但是,计算机能处理的远不止数值,还可以处理文本、图形、音频、视频、网页等各种各样的数据,不同的数据,需要定义不同的数据类型。在Python中,能够直接处理的数据类型有以下几种:

使用dict和set

dict

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list

 技术分享

 

给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长。

如果用dict实现,只需要一个名字”-“成绩的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用Python写一个dict如下:

 技术分享

 

为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。

第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。

dict就是第二种实现方式,给定一个名字,比如‘Michael‘dict在内部就可以直接计算出Michael对应的存放成绩的页码,也就是95这个数字存放的内存地址,直接取出来,所以速度非常快。

你可以猜到,这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value

把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:

 技术分享

 

由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:

技术分享

 

如果key不存在,dict就会报错:

技术分享

 

要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:

技术分享

 

二是通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:

技术分享

 

set

setdict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key

要创建一个set,需要提供一个list作为输入集合:

 技术分享

 

注意,传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1233个元素,显示的顺序也不表示set是有序的。。

重复元素在set中自动被过滤:

 技术分享

 

通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:

技术分享

 

通过remove(key)方法可以删除元素:

技术分享

 

set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:

技术分享

 

set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如:

技术分享

 

虽然字符串有个replace()方法,也确实变出了‘Abc‘,但变量a最后仍是‘abc‘,应该怎么理解呢?

我们先把代码改成下面这样:

 技术分享

 

4.切片

取一个list或tuple的部分元素是非常常见的操作。比如,一个list如下:

技术分享

 

取前3个元素,应该怎么做?

笨办法:

 技术分享

 

切片操作十分有用。我们先创建一个0-99的数列:

技术分享

 

可以通过切片轻松取出某一段数列。比如前10个数:

技术分享

 

字符串‘xxx‘也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:

技术分享

 

有了切片操作,很多地方循环就不再需要了。Python的切片非常灵活,一行代码就可以实现很多行循环才能完成的操作。

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

Python学习——02-Python基础——4-文件处理与三元运算

Python基础知识(24)Tuple与List的区别以及应用场景

Python语言基础与应用 (P16)上机练习:基本数据类型

python基础

Python 基础之 线程与进程

Python语言基础与应用 (P23)上机练习:容器类型操作(未完待续)