乐趣区

关于python:oeasypython0020换行字符feedlinelf反斜杠nB语言安徒生童话

换行字符

回顾上次内容

  • struct 包能够让咱们应用封包格局

    • 把数字封包到字节里

      • pack 函数负责封包
      • unpack 函数负责解封
    • 咱们通过封到不同的字节状态

      • 遍历了一次 ascii 码
  • 还是有那片彩色的区域

    • 如同是一片光明森林!
    • 那外面到底有些什么机密?🤔
  • 咱们这次向光明森林区域进发!!👊
  • 整理行装
  • 登程!

chr

  • 先看看 ”oeasy” 这个字符串是如何存在的🤔
  • 字符都对应着一个数字

    • 数字在计算机上到底是如何存储的呢?
    • 用二进制模式存储在字节中的
  • 能够看看这个二进制模式么?

chr

  • 8bit 形成 byte
  • 上图的字节为

    • (0011 0101)2
    • (35)16
    • 对应着字符 ’5′
  • 那字母呢?🤔
  • abcd 在内存里长什么样子?

文件编码

  • 编写一个文件

    • 写下 abcd
    • :%!xxd
    • :%!xxd -r 变回来
  • 能够看到文件是用 2 进制 形式存储的

    • 0x61 – a
    • 0x62 – b
    • 0x63 – c
    • 0x64 – d
  • 不论是内存、硬盘还是网络传输

    • a 对应

      • (0x61)16
      • (0b01100001)2
  • 图中最初的那个 0x0a 对应什么字符???

善用函数

  • 应用 chr 失去相干字符
  • 0x0a 对应的是 ’\n’ 这个字符
  • 这个字符如同在哪里见过?🤔

回到最后

  • 想要理解这个 ’\n’

    • 咱们还得回到最后
  • 咱们回到开始的时候
  • 后面介绍过

    • BWK 写的 c 语言的第一个程序

\n

  • 留神到 hello world 前面的 \n 了么?

    • 留神到 hello world 前面的 \n 了么?
    • 特地留神斜杠的方向

      • 这个方向 \ 叫反斜杠

        • 键盘地位在回车键左近
  • \n 到底是什么??🤔

输入 ”\n”

  • \n 是一个整体

    • 占一个字节
    • 算一个字符
    • 序号是(10)10 进制
    • 也就是(0x0a)16 进制
    • 这就是在开篇时的 abcd 前面的字符
    • \n 在内存里显示为一个.
  • 咱们间接把他输入看看

输入

  • 输入
# 输入 \n
print("\n")
#间接 print
print()
#查看序号
ord("\n")
#查看十六进制的序号
hex(ord("\n"))
  • 输入后果
  • 如同换了 2

    • 如果没 \n 的话,只换 1
    • 如果有 \n 的话, 就换 2
  • 咱们看看 ascii 码表是如何定义的这第 10 个字符的

找到地位

  • 咱们曾经身在在光明森林中

    • 找到了一个落脚点
  • 十进制的10 就是 十六进制的 0x0A

    • 这个数值在 ascii 码表中意思是 LF
  • 啥意思?

搜寻

  • 搜寻 \n 失去的后果是这样的

    • LF 意味着 Line Feed
    • 喂行
    • 喂一行纸
  • 那我真的能够用这个 \n 在字符两头换行嘛?

尝试换行

# 输入字符串中带有 \n
print("Hello\nWorld")
  • 在游乐场中尝试
  • 中途换行胜利!
  • 能够多来几个换行符吗?

多来几个

  • 就往里面加\n
# 输入字符串中带有 \n
print("He\nllo\nWor\nld")
  • 显然这个 \n 就是一个换行

    • 字符串外面有个 \n 就意味着须要换 1 行
    • 他的英文是 Line Feed
    • 意思就是 新换 1 行
    • 这个货色其实比 ascii 的历史还要悠久
    • 从打字机的时代就有了
  • 为什么要有换行符呢?

换行符

  • 最最开始的时候分段落

    • 都是靠打字机输入空格实现换行
    • 自从有了这个LineFeed
    • 一个键就间接换行了
    • 所以LineFeed 极大地提高了效率
  • 两个换行符就换两行
  • 能够应用 chr 函数么?

应用序号失去换行符

# 输入 ascii 值为 10 的字符
chr(10)
#把这个字符放在 print 外面输入
print("hello"+chr(10)+"world")
  • 纯文本中也会有回车符么?
  • 咱们去看看纯文本文件

关上文本文档

https://github.com/overmind1980/oeasy-python-tutorial.git
vi oeasy-python-tutorial/samples/000016/anderson_fairy_tales.txt
  • 首先下载这个仓库
  • 而后找到其中的安德森仙话这个本书
  • 咱们发现这个货色是 318K
  • 那他有多少字符呢?

字符数量

  • 1 个英文字符占一个字节

    • 318k 大略有 318000 个字节
    • 大略是 31.8 万个字符
  • 这就是文本文件的模式
  • 第一行的 Andersen 前面有应该有两个换行符
  • 是不是呢真有换行符呢?

字节模式

  • 所有行转化为字节模式

    • %!xxd
  • 查找 0a

    • /0a
  • 的确可能找到那两个换行符(0a)
  • 这能够和纯文本形式对应起来吗?

纯文本形式

  • 文本中的换行

    • 其实就是换行符的成果
  • 在文本观看模式下是换行
  • 在字节观看模式下是 0a
  • 这本书起初被翻译成安徒生童话

安徒生童话

  • 外面有很多耳熟能详的故事

    • 《皇帝的新装》
    • 《海的女儿》
    • 《丑小鸭》
    • 《红舞鞋》
    • 《卖火柴的小女孩》
    • 《拇指姑娘》
  • 在安徒生所处的时代(1805-1875)

    • 丹麦仍是一个君主专制主义社会
    • 20 年代经济衰退
    • 童话用儿童视角透视简单生存
    • 万物有灵
    • 有趣风趣
  • Jean Hersholt

    • 将 160 个故事从丹麦文翻译成英文
  • 刘半农 1914 年

    • 翻译了《皇帝的新衣》开始
  • 叶君健 1944 年到 1949 年

    • 翻译了 安徒生童话选集
  • 互联网时代

    • 英文版安徒生童话被谷腾堡我的项目所收录

落实

  • 文档当中就是用 0 和 1 来示意字符的
  • 如下图所示

    • 文字是蓝色的
    • 字节是彩色的
  • 为什么 \n 会用来示意换行 (Line-Feed) 呢?

追溯历史

  • c 语言 中的 \n 来自于什么呢?

    • 来自于 B 语言
    • B 语言 是里奇和汤普逊最早开发 unix 的语言
    • B 语言 1969 年 就 运行在bell 实验室PDP-8
  • 1971 年里奇和汤普逊开始对于 B 语言 进行革新

    • 在新买的 PDP-11 上用 B 语言 B 语言 写扩大,称之为 NewB
    • 1973 年 NewB 根本主体实现

      • 改名叫 c 语言
    • 所以 c 其实是 NewB
  • 他们用手头的编译器和 c 语言PDP-11 重写了一个 Unix Kernel

    • 机器语言和汇编语言原本不具备移植性
    • 就像 x86 的二进制程序不能间接运行在 arm 上
    • 须要移植
  • c 语言 程序却能够在 很多架构 的处理器上编译运行

    • 只有那种架构的处理器具备对应的 c 语言编译器和库
    • 那就能顺利编译成针对该处理器架构的二进制程序
    • 甚至能实现跨平台编译

      • 也就是明天所说的穿插编译
    • 这就是 c 语言 在过后可能倒退的起因
  • c 语言 源自 B 语言
  • B 语言 也不是凭空发明的

    • 源自什么呢?

Basic Combined Programming Language(BCPL)

  • B 语言 源自BCPL(Basic Combined Programming Language)

    • 1967 年由剑桥大学的 Matin Richards 制作
  • 在同样由剑桥大学开发的 CPL 语言 上改良而来

    • BCPL 最早被用做牛津大学的 OS6 操作系统 下面的开发工具
  • 起初通过美国贝尔实验室的改良和推广成为了 UNIX 上的罕用开发语言

    • 最早 BCPL 语言的样子就有个相似于 l(ine)f(eed)的符号
    • 这是对于换行符表示法 最早的记录
    • 过后的换行符长什么样呢?

BCPL 的换行符

  • 过后的换行符长成这样

    • !*n
  • 上述程序的目是

    • 输入 hello,world
    • 而后再来个回车
  • 所以 hello world

    • 并不是 c 语言的创造
    • 而是从 c 语言的爷爷 bcpl 那时候就有了
    • 并且从 bcpl 时代就曾经作为迷因 (meme) 开始流传
  • python 虚拟机的可执行文件
  • 也就是 pyc 文件是如何了解换行符的呢?

反汇编(disassemble)

  • 察看一下
  • \n 呈现在字符串常量中
  • 能在 pyc 中找到这个常量么?

先编译

  • 将 py 文件编译成 pyc 文件
  • 再察看

pyc 文件

  • 关上 pyc 文件
  • 的确可能找到 a 和 s 之间的 \n
  • 也就是(0a)16 进制
  • 工作实现!!!

总结

  • \n 就是换行符号

    • 换行符对应着 ascii 字符的代码是(10)10 进制
    • 换行符的英文是 LF
    • 意思是Line Feed
  • 咱们能够在《安徒生童话》的文本中

    • 找到每个字符对应的字节状态
  • 不光 txt 文件是文件

    • 咱们的 python 游乐场实质上也是一个二进制可执行的文件
    • 这个文件在哪?
  • 咱们能够读懂这个可执行文件吗?🤔
  • 咱们下次再说!👋
  • 蓝桥 ->https://www.lanqiao.cn/teache…
  • github->https://github.com/overmind19…
  • gitee->https://gitee.com/overmind198…
  • 视频 ->https://www.bilibili.com/vide… 作者:oeasy
退出移动版