学习 | Python之简介&安装&第一个Python程序,此文过一遍基本上可以出个“Hello,world!”了。Python作为编程语言家族的一员,自然也是有自己的一套语法,编译器或解释器就是负责把符合语法的程序代码转换成CPU能够执行的机器码,然后执行。此文主要是了解熟悉Python的数据类型和流程语句(if,for,while,独有的dict、set等),还有必不可少的“大坑、小坑、中坑、老坑们”
同样,文末可加微信群~方便大家交流~
文:https://www.liaoxuefeng.com/
本文内容主要包括以下模块:【本文篇幅略长,可选择实践!】
数据类型和变量:整型-浮点数-字符串-布尔值-空值-变量;
字符串和编码:如果没有特殊业务要求,请牢记仅使用UTF-8
编码;
列表list和元祖tuple:Python内置的有序集合,list可变,tuple不可变;
条件判断和循环:if,else,elif,for...in,while,break,continue;
dict和set:map,使用键-值(key-value)存储。
Python的语法比较简单,采用缩进方式,写出来的代码就像下面的样子:
以#
开头的语句是注释,其他每一行是一个语句,当语句以冒号:
结尾时,缩进的语句视为代码块。
按照约定俗成的管理,应该始终坚持使用4个空格的缩进。缩进的坏处就是“复制-粘贴”功能失效了,这是最坑爹的地方。另,Python程序是大小写敏感的。
计算机能处理的远不止数值,还可以处理文本、图形、音频、视频、网页等各种各样的数据,不同的数据,需要定义不同的数据类型。在Python中,能够直接处理的数据类型有以下几种:
1、整型:与其他语言一致,PASS!
2、浮点数:与其他语言一致,PASS!
3、字符串:除了表示有所差异,其他与别的语言一致,下面会再赘述一些!
4、布尔值/代数:与其他语言一致,PASS!
5、空值:空值是Python里一个特殊的值,用None
表示。None
不能理解为0
,因为0
是有意义的,而None
是一个特殊的空值。
6、变量:与其他语言一致。老生常谈一下【变量名必须是大小写英文、数字和_
的组合,且不能用数字开头】。但有两个概念需要在下面做个说明“动态语言”and“静态语言”。
7、常量:就是不能变的变量,通常用全部大写的变量名表示常量,但事实上仍然是一个变量,Python根本没有任何机制保证大写的变量
不会被改变。
字符串是以单引号'
或双引号"
括起来的任意文本。
字符串内部既包含'
又包含"
,可以用转义字符\
来标识。转义字符\
可以转义很多字符,比如\n
表示换行,\t
表示制表符,字符\
本身也要转义,所以\\
表示的字符就是\
,可以在Python的交互式命令行用print()
打印字符串看看:
Python还允许用r''
表示''
内部的字符串默认不转义:
如果字符串内部有很多换行,用\n
写在一行里不好阅读,为了简化,Python允许用'''...'''
的格式表示多行内容【注意...
是提示符,不是代码的一部分】:
变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言,赋值语句如下(// 表示注释):
而,对于动态语言,当我们写:
时,Python解释器干了两件事情:
1、在内存中创建了一个'ABC'
的字符串;
2、在内存中创建了一个名为a
的变量,并把它指向'ABC'
。
注意:
对变量赋值x = y
是把变量x
指向真正的对象,该对象是变量y
所指向的。随后对变量y
的赋值不影响变量x
的指向。
注意:Python的整数没有大小限制,而某些语言的整数根据其存储长度是有大小限制的,例如Java对32位整数的范围限制在-2147483648
-2147483647
。
Python的浮点数也没有大小限制,但是超出一定范围就直接表示为inf
(无限大)。
关于ASCII、Unicode和UTF-8的关系请大家自行查询。此处不赘述。
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:
浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:
所以你看到很多网页的源码上会有类似<meta charset="UTF-8" />
的信息,表示该网页正是用的UTF-8编码。
Python 3的字符串使用Unicode,直接支持多语言。
当str
和bytes
互相转换时,需要指定编码。最常用的编码是UTF-8
。Python当然也支持其他编码方式,比如把Unicode编码成GB2312
:
>>> '中文'.encode('gb2312')b'\xd6\xd0\xce\xc4'
但这种方式纯属自找麻烦,如果没有特殊业务要求,请牢记仅使用UTF-8
编码。
格式化字符串的时候,可以用Python的交互式环境测试,方便快捷。
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
变量classmates
就是一个list。用len()
函数可以获得list元素的个数:
用索引来访问list中每一个位置的元素,记得索引是从0
开始的;当索引超出了范围时,Python会报一个IndexError
错误,所以,要确保索引不要越界,记得最后一个元素的索引是len(classmates) - 1
。
如果要取最后一个元素,除了计算索引位置外,还可以用-1
做索引,直接获取最后一个元素,以此类推,可以获取倒数第2个、倒数第3个,当然,倒数第4个就越界了:
list是一个可变的有序表,所以,可以往list中追加元素到末尾:
也可以把元素插入到指定的位置,比如索引号为1
的位置:
要删除list末尾的元素,用pop()
方法;要删除指定位置的元素,用pop(i)
方法,其中i
是索引位置:
要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:
list里面的元素的数据类型也可以不同,list元素也可以是另一个list;如果一个list中一个元素也没有,就是一个空的list,它的长度为0。
tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字:
现在,classmates这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用classmates[0]
,classmates[-1]
,但不能赋值成另外的元素。
不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来。
只有1个元素的tuple定义时必须加一个逗号,
,来消除歧义。
(if,else,elif,for...in,while,break,continue)与其他语言一致,下面来张图感受一下,唯一需要额外注意的大坑就是“缩进的空格”啦:
dict【划重点!!!关于dict和set原样遵照廖大牛教程,这算是Python独有的吧】
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:
要删除一个key,用pop(key)
方法,对应的value也会从dict中删除。
请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。
和list比较,dict有以下几个特点:
1、查找和插入的速度极快,不会随着key的增加而变慢;
2、需要占用大量的内存,内存浪费多。
而list相反:
1、查找和插入的时间随着元素的增加而增加;
2、占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。
这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key。
set
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
要创建一个set,需要提供一个list作为输入集合:
通过add(key)
方法可以添加元素到set中,可以重复添加,但不会有效果;通过remove(key)
方法可以删除元素;set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作。
set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。
使用key-value存储结构的dict在Python中非常有用,选择不可变对象作为key很重要,最常用的key是字符串。
tuple虽然是不变对象,但试试把
(1, 2, 3)
和(1, [2, 3])
放入dict或set中,并解释结果。
声明:以下内容是基于廖雪峰的Python教程实践编写的内容,如有转载,请注明来源公众号“AI深入浅出”。
学习交流,欢迎加入以下微信群:
更
多
精
彩
请猛戳右边二维码