python应用(5):变量类型与数据结构
如前所说,写程序如同给算法写壳,而算法就是流程,所以流程是程序的主角(但这个流程不一定要你来设计)。在程序中,为了配合流程(算法)的实现,除了顺序、分支与循环语句的使用,还要借助“变量”这个角色。变量是重要的角色,男二号。
变量表示可变化的值,但这个值是有范围的,并不是所有值都可以放置到同一个变量中,值的范围,由变量的类型决定。
变量的类型,决定两个事情,一是用多大的空间来存储这个变量值,二是这个变量值的范围是多少。好了,这个不重要,先不要管这个细节,先把变量用起来,并掌握一些基础知识即可。
变量有哪些类型呢?
(1)数字类型、bool与字符串
这三个是常见的内置类型。
注意,值,决定了变量的类型,你给变量赋什么值,它就是什么类型。比如:
a = 10 # int整数类型
a = 9.9 # float浮点类型。变量名还是a,但是值的变化,让它变成了一个新的变量
a = 987654321L # long长整数类型,值以'L'结束
a = 3+4j # complex复数类型
以上几个变量类型,分别是int、float、long跟complex类型,这几个类型可以归为数字类型。
除了数字类型,python中的值还有bool类型跟str字符串类型,比如:
a = False # bool类型,值要么为False,要么为True
a = "hellotype" # str字符串类型
如果想知道当前变量是什么类型,那可以使用内置函数(python提供的一组函数)type()来确认,比如可以这样,留意type()的输出:
所以,基本上,python的变量类型,包括数字类型(int/float/long/complex)、bool跟str。
其中,str,即字符串,对它的操作会经常遇到,比如:
a = "hellotype"
a[1:] # 第1个字符到最后(注意索引是从0开始的)
a[2:]
a = "123456"
a[1:5] # 第1个字符到第5个字符的内容,但不包括第5个字符,也就是左闭右开的区间
a[-1] # -1表示最后一个字符,-2就是倒数第二个,如此类推
执行效果:
(2)常见的数据结构
除了以上常见的内置变量类型,pyton还提供了一些常用的数据结构,这些数据结构也是变量类型。
数据结构服务于算法,但由于某些数据结构实在太常用了,以至于很多算法都有它们的身影,于是,把这些常用的数据结构抽离出来,做为一个独立的结识点来讲,也是很合理的,但明显不是本文的事情。
数据结构,就是数据的组织结构,各个数据结构一定会有自己的组织特点。python中有几个常见的内置的数据结构,因为经常使用,甚至已经被当作变量类型,跟数字类型、bool与str一样的存在。
这几个常见的数据结构,分别是:列表、元组、集合、字典。
同样,值决定类型(或数据结构)。
list即列表,也是由值定义出来(以[]来定义),比如:
a = [1,2,3,4] # list
type(a)
list的操作,跟字符串的类似,比如:
tuple即元组,是只读列表(以()来定义),也就是元组的内容不允许修改,比如:
a = ('hellotuple', 123, True)
a[0]
a[1] = 100 # 试图修改元组的内容,会报错
a * 2 # 跟list的操作一致,内容重复2次,并产生新的元组
b = (1,2)
a + b # 元组相加是可以的,因为产生了新的元组,并没有修改原来的元组
执行的效果如下:
list跟tuple的特点,是可以存放任意类型的元素,内容有序、可重复。
另一种常见的数据结构是set,特点是,可以存放任意类型的元素,内容是无序的,而且不能重复,这个就是集合的特点。
set即集合的部分使用如下(以{}来定义):
a = {2, True, 'helloset'}
a[2] # 集合set是无序,所以没有索引可言,试图使用索引会导致报错
b = set('helloset') # 使用构造函数来创建一个set,注意集合中的元素会去重(这里元素是字符)
b = {'a', 'a', 1} # 元素会被去重
执行的效果如下:
最后一种数据结构是dict,也就是字典。
dict也是一个集合,是键值对(key-value)的集合,同样以{}来定义,但包括key跟value,比如:
d = {'k1':1, 'k2':2}
dict跟set类似,内容无序,而且key不能重复。set只保留了key(无序且不重复),而去掉了value。
dict的部分使用如下:
d = {}
d['k1'] = "hellodict"
d[2] = "this is int"
d[True] = "bool true"
a = {'a':'first one', 'd':'hellodict', 3:'three', 'e':34.45}
执行效果如下:
以上四种内置类型之间的转换,有可能在实际场景中应用到,操作上很简单,只需要用类型名去处理需要转换的值即可,比如:
a = list(set1) # type_name(xxx)
以上是list、tuple、set与dict的简单介绍,你可以根据实际场景去使用它们。
另外,我并没有介绍这四种数据结构的操作函数,实事上,被抽离封装的数据结构都有一系列操作函数,也就是对象的行为(对象不是指女朋友),比如以上几种数据结构,有对应的append()、pop()、remove()等一系列的操作,这个在实践中再去理解与运用了。
(3)变量类型使用示例
不管是简单的变量类型(数字类型等)还是常见的数据结构(list等),你都可以把它们归为变量类型。这些变量类型经常被使用,因为变量是程序的重要配角。
我在这里举几个示例,都是以list作为栈来解决问题的例子,希望让你对变量类型有一个使用上的感知,然后在实际场景中灵活使用。
(a)判断左右符号是否配对
左符号:([{
右符号:)]}
配对的情况如:'([]){()}',不配对的情况如:'[{]}]'。
用栈来理解就是:遍历所有字符。遇左符号则入栈;遇右符号则出栈(如果为空则直接返回False),出栈返回的字符如果与右符号不配对则返回False,如果配对则继续下一个字符。所有字符遍历完后,栈非空则返回False,否则返回True。
def sybol_match(str):
L=['(','{','['];
R=[')','}',']'];
s=[]
for c in str:
if c in L:
s.append(c)
else:
if not s:
return False
a=s.pop()
lp = L.index(a)
rp = R.index(c)
if lp!=rp:
return False
return not s
(b)计算后缀表达式
计算一个表达式时,表达式可以以中缀或后缀的方式录入,而后缀表达式由于不需要使用括号而简化了处理,所以是一个普遍的选择。
比如:
中缀:12(2/2) 后缀:12 2 2 / *
中缀:10-(23) 后缀:10 2 3 * -
中缀:(3-2)*(9/3)+5 后缀:3 2 - 9 3 / * 5 +
你可以画出树状图,再来理解(比如后缀遍历得到后缀表达式)。
用栈来理解就是:遍历所有分割项(以空格切分)。遇到数字则入栈;遇到操作符出栈两次(这里简化为都是二元操作,第一次出栈的为参数2,第二次为参数1),并进行运算,再把结果入栈。遍历完所有分割项后,返回栈中内容(只有一个值)。
operators = {
'+' : lambda p1, p2: p1+p2,
'-' : lambda p1, p2: p1-p2,
'*' : lambda p1, p2: p1*p2,
'/' : lambda p1, p2: p1/p2,
}
def calc_postfix(str):
expr = str.split()
s = []
for e in expr:
if e.isdigit():
s.append(int(e))
else:
f = operators[e]
p2 = s.pop()
p1 = s.pop()
s.append(f(p1, p2))
return s.pop()
(c)背包问题
有若干个物品,每一个物品都有重量。背包有最大容量限制,求刚好装满背包最大容量的所有解。
比如:
物品名称 重量
物品0 1kg
物品1 8kg
物品2 4kg
物品3 3kg
物品4 5kg
物品5 2kg
背包最大可以装10kg,那可能的解是:[0,2,3,5]、[1,5]等。
用栈来理解就是:尽情地装(按物品顺序,只要能装得下就装),如果剩余容量刚好为0或者之后的各个物品都装不下了,则出栈,即拿掉最后的一个物品k,再继续从k+1个物品开始装。在栈为空而且填装的物品的索引已经超出范围,则结束循环。由于,总会一直出栈到一个物品都没有,再从下一个物品开始填装,所以一定会出现栈为空且没有物品可装的情况。
def knapsack(w, ws):
"""
w --背包容量
ws --物品重量列表 [1, 3, ..]
"""
ret = []
s = []
i = 0
cnt = len(ws)
rest = w
while s or i < cnt: # 栈不为空或者还有得装
while i < cnt and rest > 0: # 还有得装且还有容量
if rest >= ws[i]: # 装得下就装
s.append(i)
rest -= ws[i]
i += 1 # 不管当前的是否装得下,都要尝试下一个
if rest == 0:
ret.append(s[:]) # one solution
i = s.pop()
rest += ws[i]
i += 1
return ret
if __name__ == '__main__':
# print(sybol_match('[{()}]{}[()]()'))
# print(sybol_match('[({}])'))
# print(calc_postfix('12 2 2 / *'))
# print(calc_postfix('3 2 - 9 3 / * 5 +'))
ret = knapsack(10, [1, 8, 4, 3, 5, 2])
print(ret)
以上是几个示例,你可不必关心算法的设计,因为这是另外的话题,重点关心代码中变量类型的使用,比如list、dict的使用等。
好了,本文介绍了python的变量类型跟常见的数据结构,你可以把内置的数据结构也当作变量类型。变量类型包括int、float、long、complex、bool、list、tuple、set、dict。文章最后还就list举了几个使用例子,希望可以帮助你理解变量类型的使用。有缘再见,see you。
python应用(5):变量类型与数据结构的更多相关文章
- Python学习--03变量类型
变量赋值 Python中的变量不需要声明,变量的赋值操作既是变量声明和定义的过程. 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息. 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创 ...
- python学习之变量类型
变量: 变量是保存在内存中的值,根据变量类型开辟不同的内存空间且只允许符合该数据类型的数据才可以被存储在该内存空间中 变量赋值: 在Python中定义变量时,无需像其他语言一样需要声明数据类型.每个变 ...
- NO.2:自学python之路------变量类型、列表、字典
引言 本周初步认识了库,并学习了Python中各种类型的变量和常用操作.并完成了较为完善的用户与商家购物界面设计. 正文 模块: Python有标准库和第三方库.第三方库需要安装才能使用.大量的库可以 ...
- Python学习心得--变量类型篇
1.Python允许同时为多个变量赋值.例如:a = b = c = 1 2.Python允许多个对象指定多个变量.例如:a1, b1, c1 = 1, 2, "john" 3.使 ...
- Python开发:变量类型
1.变量赋值 #!/usr/bin/python # -*- coding: UTF-8 -*- counter = 100 # 赋值整型变量 miles = 1000.0 # 浮点型 name = ...
- python基础之变量类型和数据运算
一.变量的类型 程序中,为了更充分的利用内存空间以及更有效率的管理内存,变量是有不同的类型的. 怎样知道一个变量的类型呢? 在python中,只要定义了一个变量,而且它有数据,那么它的类型就已经确定了 ...
- Python入门-初识变量类型
上一篇我们学习了第一行代码,我们print()了很多代码,我们可以print哪些东西呢,这一篇来讲. print()括号里面可以放哪些东西呢?..可以放很多东西,只要是Python的全部数据类型都可以 ...
- Python中的变量类型
原文传送门:点击
- python2.7入门---变量类型
这篇文章呢,主要是用来记录python中的变量类型学习内容的.接下来就来看一下变量类型,那么什么是变量呢.变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间.基于变量的数据类型,解 ...
随机推荐
- 十八般武艺玩转GaussDB(DWS)性能调优(三):好味道表定义
摘要:表结构设计是数据库建模的一个关键环节,表定义好坏直接决定了集群的有效容量以及业务查询性能,本文从产品架构.功能实现以及业务特征的角度阐述在GaussDB(DWS)的中表定义时需要关注的一些关键因 ...
- MIT黑科技:通过手机记录的咳嗽数据检测是否感染新冠病毒
这次的新冠状病毒虽然没有2002年的SARS破坏力那么强悍,但其可怕之处是长时间的无症状潜伏,使得被感染者在不知情的情况下,将病毒散播出去.如果没有强有力的防疫手段,病毒的传播几乎难以控制.而防止病毒 ...
- (六)HTTP和HTTPS(转)
一.HTTP和HTTPS的基本概念 HTTP:用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少. HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的 ...
- 剑指Offer-Python(1-5)
1.二维数组的查找 查找,其实就可以挨个进行比较就可以.又由于题目说明(每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序),因此如果利用类似于二分查找的方法,那么比较次数则会更少 ...
- 搭建面向NET Framework的CI/CD持续集成环境(一)Windows服务器安装Jenkins
前言 网上大多数都是针对主流的Spring Cloud.NET Core的CI/CD方案.但是目前国内绝大部分的公司因为一些历史原因无法简单的把项目从NET Framework切换升级到NET Cor ...
- [MIT6.006] 11. Integer Arithmetic, Karatsuba Multiplication 整型算术,Karatsuba乘法
很多人不喜欢√2的表达,他们认为它不是一个数. 一.卡塔兰数 Catalan numbers 在数方面上,有个著名的数叫卡塔兰数 Catalan numbers,它是组合数学中一个常在各种计数问题中出 ...
- fork-vfork -exit&_exit
昨天帮人查bug,发现了一个vfork fork exit _exit不分导致的问题. 使用vfork 后调用exit导致的问题. 主要需要弄清楚他们之间的区别: 1. fork ():子进程拷 ...
- 一次webpack小规模优化经历
这标题一点营销号味道都没有,怎么会有人看啊!(笑) 没人看也无所谓的文章背景: 八月份入职了新公司,是个好几年的老项目了,公司产品是存在很久了,但我接触到的代码版本保守估计应该是有个三年到四年这样的历 ...
- java 关于 a==null 和 null==a, a.equals("123") 和“123”.equals(a)
一: a==null 和 null==a 实验 所以 a==null 和 null==a 没区别 二: a.equals("123") 和"123".equal ...
- SMBv3远程代码执行漏洞复现(CVE-2020-0796)
漏洞基本信息 服务器消息块(SMB),是一个网络通信协议,用于提供共享访问到文件,打印机和串行端口的节点之间的网络上.它还提供了经过身份验证的进程间通信机制.SMB的大多数用法涉及运行Microsof ...