变量创建过程

首先,当我们定义了一个变量name = ‘oldboy’的时候,在内存中其实是做了这样一件事:

程序开辟了一块内存空间,将‘oldboy’存储进去,再让变量名name指向‘oldboy’所在的内存地址。如下图所示:

我们可以通过id()方法查看这个变量在内存中的地址

  1. >>> name = "oldboy"
  2. >>> id(name)
  3. 4317182304

python 解释器有自动垃圾回收机制,自动隔一段时间把没有跟变量名关联的内存数据回收

name = "wuxiping"
name = "Jack"
print(id(name))name = "Alex"
name1 = name
print(name1)
print(id(name),id(name1))name = "黑姑娘"
print(name1)   # 因为name1是直接指向Alex,所以name1 没变

身份运算

python 中有很多种数据类型, 查看一个数据的类型的方法是type().

判断一个数据类型是不是str, or int等,可以用身份运算符is

  1. >>> type(name) is str
  2. True
  3. >>>
  4. >>> type(name) is not int
  5. True
# 身份运算
name = "Alex"
name1 = "黑姑娘"
print(type(name1))
print(type(name1) is str)
print(type(name1) is int)
# 不能直接说 name1 is str,因为name1 是一个字符串,现在判断的是它是不是一个字符串类型!因此要先拿到它的类型
print(name1 is str)age = 12.32
print(type(age) is not float)

空值None

代表什么都没有的意思,一般用在哪呢? 比如玩游戏,你要初始化一个女朋友, 需要填上姓名、年龄、身高、体重等信息, 这些信息是让玩家填的,在填之前,你要先把变量定义好,那就得存个值 ,这个值用0,1来占位不合适 ,用True,False也不合适 ,用None最合适

  1. >>> name=None
  2. >>> age=None
  3. >>> height=None
  4. >>> weight=None
  5. >>>
  6. >>> name,age,height,weight
  7. (None, None, None, None)
  8. >>>

此时可用is 运算符来判断变量是不是None

  1. >>> if name is None:
  2. ... print("你的女朋友还没起名字呢.")
  3. ...
  4. 你的女朋友还没起名字呢.

其实用==判断也行,但是不符合开发规范

  1. >>> name == None
  2. True

三元运算

显的很NB的代码写法。

# 三元运算
a = 10
b = 5
if a>15:c = a
else:c = b
print(c)
# 或者
d = a if a>15 else b
print(d)

d = 值1 if 条件A else 值2

如果条件A成立,就取左边值1,否则就取值2

细讲数据类型----列表

追加,数据会追加到尾部

  1. >>> names
  2. ['alex', 'jack']
  3. >>> names.append("rain")
  4. >>> names.append("eva")
  5. >>>
  6. >>> names
  7. ['alex', 'jack', 'rain', 'eva']

插入,可插入任何位置

  1. >>> names.insert(2,"黑姑娘")
  2. >>> names
  3. ['alex', 'jack', '黑姑娘', 'rain', 'eva']
  4. >>>

合并,可以把另一外列表的值合并进来

  1. >>> n2 = ["狗蛋","绿毛","鸡头"]
  2. >>> names
  3. ['alex', 'jack', '黑姑娘', 'rain', 'eva']
  4. >>> names.extend(n2)
  5. >>> names
  6. ['alex', 'jack', '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛', '鸡头']

列表嵌套

  1. >>> names.insert(2,[1,2,3])
  2. >>> names
  3. ['alex', 'jack', [1, 2, 3], '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛', '鸡头']
  4. >>> names[2][1]
  5. 2

删除操作

del 直接删

  1. >>> names
  2. ['alex', 'jack', [1, 2, 3], '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛', '鸡头']
  3. >>> del names[2]
  4. >>> names
  5. ['alex', 'jack', '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛', '鸡头']

pop 删

  1. >>> names
  2. ['alex', 'jack', '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛', '鸡头']
  3. >>> names.pop() #默认删除最后一个元素并返回被删除的值
  4. '鸡头'
  5. >>> names
  6. ['alex', 'jack', '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛']
  7. >>> help(names.pop)
  8. >>> names.pop(1) #删除指定元素
  9. 'jack'

clear 清空

  1. >>> n2
  2. ['狗蛋', '绿毛', '鸡头']
  3. >>> n2.clear()
  4. >>> n2
  5. []

修改操作

  1. >>> names
  2. ['alex', '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛']
  3. >>> names[0] = "金角大王"
  4. >>> names[-1] = "银角大王"
  5. >>> names
  6. ['金角大王', '黑姑娘', 'rain', 'eva', '狗蛋', '银角大王']

查操作

  1. >>> names
  2. ['金角大王', '黑姑娘', 'rain', 'eva', '狗蛋', '银角大王', 'eva']
  3. >>>
  4. >>> names.index("eva") #返回从左开始匹配到的第一个eva的索引
  5. 3
  6. >>> names.count("eva") #返回eva的个数
  7. 2
name = ['金角大王', '黑姑娘', 'rain', 'eva', '狗蛋', '银角大王', 'eva']# 切片,顾头不顾尾
print(name[1:4])
print(name[1:-2])
print(name[1:])  # 可取最后一个数
print(name[:5])
# 倒着切
print(name[-5:-1])
print(name[-5:])
# 步长, 允许跳着取值
print(name[0:-1:1])
print(name[0:-1:2])
print(name[0:-1:3])# 从右往左走
print(name[-1:-5:-1])  # 步长变成负的即可print(name[:]) # 都省略,全取
print(name[0:-1:2])
print(name[::2])

# 反转
name = ['金角大王', '黑姑娘', 'rain', 'eva', '狗蛋', '银角大王', 'eva']n = "银角大王"
print(n[::-1])
name.reverse()
print(name)# 排序
name.sort()
print(name)
# 循环列表
for i in name:print(i)

细讲数据类型-元组(大部分和列表相似)

  不可修改

索引,切片,等

count,index

注意:元组本身不可变,如果元组中还包含其他可变元素,这些可变元素可以改变

>>> data
(99, 88, 77, ['Alex', 'Jack'], 33)
>>> data[3][0] = '金角大王'
>>> data
(99, 88, 77, ['金角大王', 'Jack'], 33)

为啥呢? 因为元组只是存每个元素的内存地址,上面[‘金角大王’, ‘Jack’]这个列表本身的内存地址存在元组里确实不可变,但是这个列表包含的元素的内存地址是存在另外一块空间里的,是可变的。

 细讲数据类型-字符串

定义

字符串是一个有序的字符的集合,用于存储和表示基本的文本信息,’ ‘或’’ ‘’或’’’ ‘’’中间包含的内容称之为字符串

反转:将步长变成-1即可

特性:

按照从左到右的顺序定义字符集合,下标从0开始顺序访问,有序

1.可以进行切片操作

2.不可变,字符串是不可变的,不能像列表一样修改其中某个元素,所有对字符串的修改操作其实都是相当于生成了一份新数据。

补充:

1.字符串的单引号和双引号都无法取消特殊字符的含义,如果想让引号内所有字符均取消特殊意义,在引号前面加r,如name=r’l\thf’

字典:

字典是Python语言中唯一的映射类型。

定义:{key1:value1,key2:value2}

特性:

1.key-value结构

2.key必须为不可变数据类型、必须唯一

3.可存放任意多个value、可修改、可以不唯一

4.无序

5.查询速度快,且不受dict的大小影响,至于为何快?我们学完hash再解释。

# coding=utf-8
# 字典:定义:{key1:value1,key2:value2}
# info = {#     "name":"小猿圈",
#     "mission": "帮一千万极客高效学编程",
#     "website": "http://apeland.com"}
# print(info.keys())# 创建操作
# person = {"name": "alex", 'age': 20}# person = dict(name='seven', age=20)# keys = [1,2,3,4,5]
# a= {}.fromkeys(keys,100)
# print(a)# 增加
# person = {"name": "alex", 'age': 20}
# person["job"] = "Teacher"
# print(person)
# person.setdefault("salary",[1,2,3])
# print(person)
# 删除
person = {"name": "alex", 'age': 20}
# print(person)
# print(person.pop("name"))   # 删除指定键key
# print(person)
# print(person)
# del person["name"]    # 删除指定键key
# print(person)
# print(person.clear())  # 清空字典# 修改操作
# person["name"] = "NAME"
# print(person)  # 替代原先的value值
# person1 = {"gender":"male"}
# print(person.update(person1)) # 将字典person1的键值对添加到字典person中
# print(person)# 查操作
# print(person["name"]) # 返回字典中key对应的值,若key不存在字典中,则报错
# print(person.get("name")) # 返回字典中key对应的值,若key不在字典中,则返回default的值(default默认为None)
# print("name" in person)  # 若存在则返回True,否则返回False
# print(person.keys()) # 返回一个包含字典所有key的列表
# print(person.values()) # 返回一个包含字典所有value的列表
# print(person.items()) # 返回一个包含所有(键,值)元祖的列表# 循环
# for i in person:
#     print(i,person[i])
# for i in person.items():
#     print(i)
# for k,v in person.items():
#     print(k,v)
# for i in person.keys():
#     print(i)
for i in person.values():print(i)

细讲数据类型-集合

定义

1.里面的元素不可变,代表你不能存一个list、dict 在集合里,字符串、数字、元组等不可变类型可以存

2.天生去重,在集合里没办法存重复的元素

3.无序,不像列表一样通过索引来标记在列表中的位置 ,元素是无序的,集合中的元素没有先后之分,如集合{3,4,5}和{3,5,4}算作同一个集合

基于上面的特性,我们可以用集合来干2件事,去重和关系运算

# 创建集合  set 增删查
a = {1,2,3,4,2,'alex',3,'rain','alex'}
print(a)
a.add(5)
print(a)
# a.add([1,2,3])
# print(a)
a.add((1,2,3))
print(a)
# 删除
a.discard(5)
# 随机删除
a.pop()
# 如果没有该元素就会报错
a.remove()

# 关系运算
s_1024 = {"佩奇","老男孩","海峰","马JJ","老村长","黑姑娘","Alex"}
s_pornhub = {"Alex","Egon","Rain","马JJ","Nick","Jack"}
print(s_1024 & s_pornhub)  # 交集, elements in both set
print(s_1024 | s_pornhub)  # 并集 or 合集
print(s_1024 - s_pornhub)  # 差集 , only in 1024
print(s_pornhub - s_1024)  # 差集,  only in pornhub
print(s_1024 ^ s_pornhub)  # 对称差集, 把脚踩2只船的人T出去
print(s_1024.intersection(s_pornhub))

 秒懂二进制

字符编码之文字是如何显示的

ASCII码

这张表就是计算机显示各种文字、符号的基石呀

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。

在这里,每一位0或者1所占的空间单位为bit(比特),这是计算机中最小的表示单位

每8个bit组成一个字节,这是计算机中最小的存储单位(毕竟你是没有办法存储半个字符的)orz~

  1. bit 位,计算机中最小的表示单位
  2. 8bit = 1bytes 字节,最小的存储单位,1bytes缩写为1B
  3. 1KB=1024B
  4. 1MB=1024KB
  5. 1GB=1024MB
  6. 1TB=1024GB
  7. 1PB=1024TB
  8. 1EB=1024PB
  9. 1ZB=1024EB
  10. 1YB=1024ZB
  11. 1BB=1024YB

GBK2312   2个字节代表一个字符

论断句的重要性与必要性:

Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode

UTF-8

新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,由于计算机的内存比较大,并且字符串在内容中表示时也不会特别大,所以内容可以使用unicode来处理,但是存储和网络传输时一般数据都会非常多,那么增加1倍将是无法容忍的!!!

为了解决存储和网络传输的问题,出现了Unicode Transformation Format,学术名UTF,即:对unicode字符进行转换,以便于在存储和网络传输时可以节省空间!

  • UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个

    • UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
    • UTF-32: 使用4个字节表示所有字符;

总结:UTF 是为unicode编码 设计 的一种 在存储 和传输时节省空间的编码方案。

如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间:

hash是个什么东西阅读量: 461

什么是哈希?

hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间。

它其实就是一个算法,最简单的算法就是加减乘除,比方,我设计个数字算法,输入+7=输出,比如我输入1,输出为8;输入2,输出为9。

哈希算法不过是一个更为复杂的运算,它的输入可以是字符串,可以是数据,可以是任何文件,经过哈希运算后,变成一个固定长度的输出,该输出就是哈希值。但是哈希算法有一个很大的特点,就是你不能从结果推算出输入,所以又称为不可逆的算法

哈希特性

不可逆:在具备编码功能的同时,哈希算法也作为一种加密算法存在。即,你无法通过分析哈希值计算出源文件的样子,换句话说:你不可能通过观察香肠的纹理推测出猪原来的样子。

计算极快:20G高清电影和一个5K文本文件复杂度相同,计算量都极小,可以在0.1秒内得出结果。也就是说,不管猪有多肥,骨头多硬,做成香肠都只要眨眨眼的时间,

哈希的用途

哈希算法的不可逆特性使其在以下领域使用广泛

1.密码,我们日常使用的各种电子密码本质上都是基于hash的,你不用担心支付宝的工作人员会把你的密码泄漏给第三方,因为你的登录密码是先经过 hash+各种复杂算法得出密文后 再存进支付宝的数据库里的

2.文件完整性校验,通过对文件进行hash,得出一段hash值 ,这样文件内容以后被修改了,hash值就会变。 MD5 Hash算法的”数字指纹”特性,使它成为应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。

3.数字签名,数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。

此外,hash算法在区块链领域也使用广泛。

md5加密算法

基于hash的数据类型有哪些?

Python 中基于hash的2个数据类型是dict and set , 之前说dict查询速度快,为何快? 说set天生去重,怎么做到的?其实都是利用了hash的特性,我们下面来剖析

用Python操作文件

  1. f=open(filename) # 打开文件
  2. f.write("我是野生程序员") # 写操作
  3. f.read() #读操作
  4. f.close() #保存并关闭

操作模式

    • r 只读模式
    • w 创建模式,若文件已存在,则覆盖旧文件
    • a 追加模式,新数据会写到文件末尾

第二章 数据类型和文件操作相关推荐

  1. SV 第二章数据类型

    SV 第二章数据类型 2.8 选择存储数组类型 2.8.1 灵活性 2.8.2 存储器用量 2.8.3 速度 2.8.4 排序 2.8.5 选择最优的数据结构 2.9 使用typedef创建新的数据类 ...

  2. c语言程序设计课件第二章,c语言程序设计课件张元国 ISBN9787566300386 PPT第二章数据类型 运算符与表达式...

    1.第2章 数据类型.运算符与表达式,语言的数据类型 常量与变量 运算符与表达式 不同类型数据间的转换,2.1语言的数据类型,数据是计算机程序处理的所有信息的总称,数值.字符.文本等都是数据,在各种程 ...

  3. 第二章 PX4-Pixhawk-RCS启动文件解析

    第二章 PX4-RCS启动文件解析 RCS的启动类似于linux的shell文件,如果不知道shell文件是什么东西可以理解成是为程序的流程框,它是告诉处理器应该怎么样去运行,前一章介绍的是编译成固件 ...

  4. 第二章 PX4-RCS启动文件解析

    版权声明:本文为博主原创文章,未经博主允许不得转载. 第二章 PX4-RCS启动文件解析 RCS的启动类似于linux的shell文件,如果不知道shell文件是什么东西可以理解成是为程序的流程框,它 ...

  5. python对文件操作的相关函数_第六章、Python文件操作

    第六章.Python文件操作 Python可以对文件进行查看.创建等功能,可以对文件内容进行添加.修改.删除,且所使用到的函数在Python3.5.x为open,在Python2.7.x同时支持fil ...

  6. c语言a123属于常量吗,c语言程序设计第二章数据类型.ppt

    c语言程序设计第二章数据类型 * 第 2章 基本数据类型及运算 教学目标:通过介绍C语言的数据类型和存储特点,要求了解C语言数值数据和文字数据的表示方法,掌握C语言基本数据类型的存储格式,掌握变量的定 ...

  7. Python初级学习教程—从入门开始学习(函数、组合数据类型、文件操作、异常、模块)

    文章目录 入门 一.数据的相关操作 二.continue 和 break的区别(易混点) 三.函数 变量的作用域 三.函数进阶 1.函数多个返回值 2.函数参数种类 3.匿名函数 组合数据类型 一.列 ...

  8. 第三章 Python基础——文件操作函数

    3.1三元运算 三元运算又称三目运算,是对简单条件的简写 if 条件成立:val=1 else:val=2 改成三元运算: val=1 if条件成立 else 2 3.2字符编码转换 编码的种类情况: ...

  9. Excel VBA高效办公应用-第十六章-VBA高效文件操作(同时给多个工作簿加解密)

    本示例演示了批量加解密文件操作. Option ExplicitPrivate Sub ComboBox1_Change()'增加列表框的选项 ListBox1.AddItem ComboBox1.T ...

最新文章

  1. 步步为营UML建模系列二、部署图(Deployment Diagram)
  2. 【深度学习】利用深度可分离卷积减小计算量及提升网络性能
  3. rtti是什么java_RTTI
  4. 判断整数序列是不是二元查找树的后序遍历结果
  5. navicat不同数据库数据传输
  6. matlab怎么写集合,matlab集合操作
  7. 卓越领导者的智慧(精华版)
  8. 贪心——跳跃游戏 II(Leetcode 45)
  9. spark之kryo序列化及其使用
  10. Spring.NET企业架构实践之 Nhibernate + WCF + ASP.NET MVC + NVelocity 对PetShop4.0重构(三)——持久层...
  11. 《Linux性能及调优指南》 Linux进程管理
  12. 测试用例设计之正交表设计
  13. 神经网络硕士就业前景,计算神经科学就业前景
  14. fft与fftshift的维度
  15. 怎么卸载apowerrec_如何卸载win10自带的游戏中心
  16. CSDN刷访问量专用博客
  17. VR Masterclass
  18. 登录服务器xp系统,xp系统登入云服务器
  19. OA系统是什么,为什么要用OA系统呢?
  20. 招商软文如何写:推广诱人的广告——文芳阁传媒有话说

热门文章

  1. Linux开发中 MD5值的计算
  2. c语言命令行选项处理函数getopt和getopt_long() 函数使用
  3. 如何选购晨检机器人_扫地机器人好不好用?如何选购?答案在这
  4. java util logging_Java 日志系列篇一 原生 Java.util.logging
  5. java编程代码大全_掌握Java编程技巧,代码重构
  6. 湖南大学计算机学院软件专业杨磊,杨磊-湖大信息科学与工程学院
  7. 中加减乘除_【泓泰花园】精雕细琢的好房子,加减乘除里都是幸福
  8. matlab示波器显示部分,Matlab 示波器显示设置
  9. c++枚举类型(二) c++11 枚举类
  10. keras 时间序列分析