学习 | Python之数据结构和流程语句

学习 | 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和setmap,使用键-值(key-value)存储。

0 - 语  法

Python的语法比较简单,采用缩进方式,写出来的代码就像下面的样子:

#开头的语句是注释,其他每一行是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块。

按照约定俗成的管理,应该始终坚持使用4个空格的缩进。缩进的坏处就是“复制-粘贴”功能失效了,这是最坑爹的地方。另,Python程序是大小写敏感的。

1 - 数据类型

计算机能处理的远不止数值,还可以处理文本、图形、音频、视频、网页等各种各样的数据,不同的数据,需要定义不同的数据类型。在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(无限大)。

2- 字符串和编码

关于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,直接支持多语言。

strbytes互相转换时,需要指定编码。最常用的编码是UTF-8。Python当然也支持其他编码方式,比如把Unicode编码成GB2312

>>> '中文'.encode('gb2312')b'\xd6\xd0\xce\xc4'

但这种方式纯属自找麻烦,如果没有特殊业务要求,请牢记仅使用UTF-8编码。

格式化字符串的时候,可以用Python的交互式环境测试,方便快捷。

3- 列表list和元祖tuple

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定义时必须加一个逗号,,来消除歧义

4- 条件判断和循环

if,else,elif,for...in,while,break,continue)与其他语言一致,下面来张图感受一下,唯一需要额外注意的大坑就是“缩进的空格”啦:

5- dict 和set

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深入浅出”。

学习交流,欢迎加入以下微信群:

请猛戳右边二维码





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值