[oeasy]python0020換行字符_feed_line_lf_反斜杠n_B語言_安徒生童話
換行字符
回憶上次內(nèi)容
struct包可以讓我們使用封包格式
遍歷了一次ascii碼
pack函數(shù)負(fù)責(zé)封包
unpack函數(shù)負(fù)責(zé)解封
把數(shù)字封包到字節(jié)里
我們通過封到不同的字節(jié)狀態(tài)

還是有那片黑色的區(qū)域
好像是一片黑暗森林!
那里面到底有些什么秘密???
我們這次向黑暗森林區(qū)域進發(fā)?。??
整理行裝
出發(fā)!
chr
先看看"oeasy"這個字符串是如何存在的??

字符都對應(yīng)著一個數(shù)字
數(shù)字在計算機上究竟是如何存儲的呢?
用二進制形式存儲在字節(jié)中的
可以看看這個二進制形式么?
chr
8bit 構(gòu)成 byte

上圖的字節(jié)為
(0011 0101)2
(35)16
對應(yīng)著字符'5'

那字母呢???
abcd在內(nèi)存里長什么樣子?
文件編碼
編寫一個文件
寫下 abcd
用
:%!xxd
:%!xxd -r
變回來

可以看到文件是用
2進制
方式存儲的0x61 - a
0x62 - b
0x63 - c
0x64 - d
不論是內(nèi)存、硬盤還是網(wǎng)絡(luò)傳輸
(0x61)16
(0b01100001)2
a 對應(yīng)
圖中最后的那個 0x0a 對應(yīng)什么字符???
善用函數(shù)
使用chr得到相關(guān)字符

0x0a對應(yīng)的是'\n'這個字符
這個字符好像在哪里見過???
回到最初
想要了解這個'\n'
我們還得回到最初
我們回到開始的時候

前面介紹過
BWK寫的 c 語言的第一個程序
\n
注意到
hello world
后面的\n
了么?這個方向
\
叫反斜杠鍵盤位置在回車鍵附近
注意到
hello world
后面的\n
了么?特別注意斜杠的方向

那
\n
到底是什么????
輸出"\n"
\n
是一個整體占一個字節(jié)
算一個字符
序號是(
10
)10進制
也就是(
0x0a
)16進制
這就是在開篇時的
abcd
后面的字符\n在內(nèi)存里顯示為一個.

我們直接把他輸出看看
輸出
輸出
#輸出\nprint("\n")#直接printprint()#查看序號ord("\n")#查看十六進制的序號hex(ord("\n"))
輸出結(jié)果

好像換了
2
行如果沒
\n
的話,只換1
行如果有
\n
的話, 就換2
行我們看看ascii碼表是如何定義的這第10個字符的
找到位置
我們已經(jīng)身在在黑暗森林中
找到了一個落腳點

十進制的
10
就是 十六進制的0x0A
這個數(shù)值在
ascii
碼表中意思是LF
啥意思?
搜索
搜索
\n
得到的結(jié)果是這樣的LF 意味著 Line Feed
喂行
喂一行紙

那我真的可以用這個
\n
在字符中間換行嘛?
嘗試換行
#輸出字符串中帶有\(zhòng)nprint("Hello\nWorld")
在游樂場中嘗試

中途換行成功!
可以多來幾個換行符嗎?
多來幾個
就往里面加
\n
#輸出字符串中帶有\(zhòng)nprint("He\nllo\nWor\nld")
顯然這個
\n
就是一個換行字符串里面有個
\n
就意味著需要換 1 行他的英文是
Line Feed
意思就是
新?lián)Q1行
這個東西其實比 ascii 的歷史還要悠久
從打字機的時代就有了

為什么要有換行符呢?
換行符
最最開始的時候分段落
都是靠打字機輸出空格完成換行
自從有了這個
L
ineF
eed一個鍵就直接換行了
所以
L
ineF
eed 極大地提高了效率

兩個換行符就換兩行
可以使用chr函數(shù)么?
使用序號得到換行符
#輸出ascii值為10的字符chr(10)#把這個字符放在print里面輸出print("hello"+chr(10)+"world")

純文本中也會有回車符么?
我們?nèi)タ纯醇兾谋疚募?/p>
打開文本文檔
https://github.com/overmind1980/oeasy-python-tutorial.git
vi oeasy-python-tutorial/samples/000016/anderson_fairy_tales.txt
首先下載這個倉庫
然后找到其中的安德森仙話這個本書

我們發(fā)現(xiàn)這個東西是318K
那他有多少字符呢?
字符數(shù)量
1個英文字符占一個字節(jié)
318k大概有318000個字節(jié)
大概是31.8萬個字符

這就是文本文件的形式
第一行的Andersen后面有應(yīng)該有兩個換行符
是不是呢真有換行符呢?
字節(jié)形式
所有行轉(zhuǎn)化為字節(jié)形式
%!xxd
查找0a
/0a

確實能夠找到那兩個換行符(0a)
這可以和純文本方式對應(yīng)起來嗎?
純文本方式
文本中的換行
其實就是換行符的效果
在文本觀看模式下是換行

在字節(jié)觀看模式下是0a
這本書后來被翻譯成安徒生童話
安徒生童話
里面有很多耳熟能詳?shù)墓适?/p>
《皇帝的新裝》
《海的女兒》
《丑小鴨》
《紅舞鞋》
《賣火柴的小女孩》
《拇指姑娘》

在安徒生所處的時代(1805-1875)
丹麥仍是一個君主專制主義社會
20年代經(jīng)濟衰退
童話用兒童視角透視復(fù)雜生活
萬物有靈
風(fēng)趣幽默
Jean Hersholt
將160個故事從丹麥文翻譯成英文
劉半農(nóng) 1914年
翻譯了《皇帝的新衣》開始
葉君健 1944年到1949年
翻譯了 安徒生童話全集
互聯(lián)網(wǎng)時代
英文版安徒生童話被谷騰堡項目所收錄
落實
文檔當(dāng)中就是用0和1來表示字符的
如下圖所示
文字是藍(lán)色的
字節(jié)是黑色的

為什么\n會用來表示換行(Line-Feed)呢?
追溯歷史
c語言
中的\n
來自于什么呢?來自于
B語言
B語言
是里奇和湯普遜最早開發(fā)unix
的語言B語言
1969 年 就 運行在bell實驗室
的PDP-8
上1971 年里奇和湯普遜開始對于
B語言
進行改造改名叫
c語言
在新買的
PDP-11
上用B語言
給B語言
寫擴展,稱之為NewB
1973 年
NewB
基本主體完成所以
c
其實是NewB
他們用手頭的編譯器和
c語言
給PDP-11
重寫了一個Unix Kernel
機器語言和匯編語言本來不具有移植性
就像x86的二進制程序不能直接運行在arm上
需要移植
c語言
程序卻可以在很多架構(gòu)
的處理器上編譯運行也就是今天所說的交叉編譯
只要那種架構(gòu)的處理器具有對應(yīng)的
c語言編譯器和庫
那就能順利編譯成針對該處理器架構(gòu)的二進制程序
甚至能實現(xiàn)跨平臺編譯
這就是
c語言
在當(dāng)時能夠發(fā)展的原因

c語言
?源自B語言
B語言
也不是憑空創(chuàng)造的源自什么呢?
Basic Combined Programming Language(BCPL)
B語言
源自BCPL(Basic Combined Programming Language)
1967 年由劍橋大學(xué)的
Matin Richards
制作

在同樣由劍橋大學(xué)開發(fā)的
CPL語言
上改進而來BCPL
最早被用做牛津大學(xué)的OS6操作系統(tǒng)
上面的開發(fā)工具
后來通過美國貝爾實驗室的改進和推廣成為了
UNIX
上的常用開發(fā)語言最早
BCPL
語言的樣子就有個類似于l(ine)f(eed)的符號這是關(guān)于換行符表示法 最早的記錄
當(dāng)時的換行符長什么樣呢?
BCPL的換行符
當(dāng)時的換行符長成這樣
!*n

上述程序的目是
輸出 hello,world
然后再來個回車
所以hello world
并不是c語言的發(fā)明
而是從c語言的爺爺bcpl那時候就有了
并且從bcpl時代就已經(jīng)作為迷因(meme)開始傳播
python虛擬機的可執(zhí)行文件
也就是pyc文件是如何理解換行符的呢?
反匯編(disassemble)
觀察一下

\n出現(xiàn)在字符串常量中
能在pyc中找到這個常量么?
先編譯
將py文件編譯成pyc文件
再觀察
pyc文件
打開pyc文件
確實能夠找到a和s之間的\n
也就是(0a)16進制
任務(wù)完成?。。?/p>
總結(jié)
\n
就是換行符號換行符對應(yīng)著
ascii
字符的代碼是(10
)10進制
換行符的英文是 LF
意思是
Line Feed
我們可以在《安徒生童話》的文本中
找到每個字符對應(yīng)的字節(jié)形態(tài)

不光txt文件是文件
我們的python游樂場本質(zhì)上也是一個二進制可執(zhí)行的文件
這個文件在哪?
我們可以讀懂這個可執(zhí)行文件嗎???
我們下次再說!??
藍(lán)橋->https://www.lanqiao.cn/teacher/3584
github->https://github.com/overmind1980/oeasy-python-tutorial
gitee->https://gitee.com/overmind1980/oeasypython
視頻->https://www.bilibili.com/video/BV1CU4y1Z7gQ 作者:oeasy