吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3418|回复: 13
收起左侧

[Python 原创] 四方python小讲堂 - 第三期(进制的奥秘,字符串的操作)【失踪人口回归】

[复制链接]
zhanary 发表于 2021-6-9 21:10
咕咕咕,咕咕咕咕咕咕咕咕
咕咕咕咕咕咕咕。。。。。


本鸽子自罚三杯。。。(我都没脸见你们了
大家听我解释(′;ω;`)本鸽子呢是去年12月毕业的,至于为啥毕业时间这么奇怪有两个原因:1 学校一年可以毕业四次 2 我被导师延毕了。。。本想读博的我被延毕杀了个措手不及啊,不得不春招找工作,压力山大
所以最近我过的非常“充实”,一直在面试,其中一天更是被安排了四个面试。。。。不过好消息是拿了个挺不错的央企研究院机会搞科研去了,已经签过了,乱七八糟的手续也跑完了,终于舒坦了。大家以后要参加校招也欢迎来问我经验啊,绝无保留_(:з」∠)_


其实本鸽子的工程能力非常的一般。。。我的技能树点的是科研方向(虽然也不咋地)所以有些小伙伴私信我想让我帮忙搞小程序啥的。。。我搞不定啊我QAQ就算要硬搞估计也得花很长时间才行。。。等我搞完了估计你们都没这个需求了。。。。


话说没看过前两期的小伙伴们,这里指路:第一期第二期

其实这一期我早就写完了,但是后面忙成球一直没修改,这才翻出来重见天日
本周我们还是接着第二期的内容肝,还在书里的第二章,这一期着重在字符串这一节,虽然放眼望去会很劝退,但是实际真的不难的,如果觉得我哪里没说清楚也欢迎大家在评论区留言~









那么首先我们先复习一下上周,啊不上期内容,回想一下
  • 什么是编译型语言,什么是解释型语言,各有啥优缺点?
  • 当我们跟python申请一个变量时,python都大概做了什么?用代码如何描述
  • 我们是怎么让python打印东西的?
  • print("sifang") 和 print(sifang) 有什么区别?



第三期呢我们主要讲为什么会有二进制、八进制、十六进制这些玩意的存在,以及字符串的一些操作,顺便分享了一点实用小代码
记得对照着书来看哈,我是补充书的内容来着
话不多说,开冲





2.3 字符串
    字符串这个概念应该是比较好理解的,就是一堆字符组成的串。不过这里大家需要注意一下,有一类数字也是用字符表示的,就是十六进制


    进制这里我稍微(骗人的稍微)展开一点,我们日常的生活里遇到的基本都是十进制,就是逢十进一位,所以是0,1,2,3,4,5,6,7,8,9,10。。。    那么二进制就是逢二就进一位,所以是0,1,10,11,100,101,110,111。。。


    不知道大家能不能直观的发现二进制是怎么计数的,首先二进制是假设只有0和1两个数字了,那么
  • 对应十进制的0,二进制也是0
  • 对应十进制的1,二进制是0+1 = 1
  • 当我们要表达十进制中的2时,1+1 = 2 但是我们没有2这个数字,就只能进位了,这里进位就像是十进制一样,个位归零,十位进1,所以此时表达十进制的2时,二进制用10表达
  • 表达3的时候,我们仍旧取出个位,0 + 1 = 1,所以二进制此时为11
  • 表达4的时候,和表达2的时候一样,个位1 + 1 = 2了,我们需要进位,那么此时个位归零,十位是1,1 + 1 = 2,十位也hold不住了,又要进一位,那么此时十位归零,百位为1,所以此时二进制表达为100

    以此类推啦,大家可以看下我画的图更清楚
   

1

1




    那么十六进制呢,他就是逢十六进一位,但是数字最大就到9怎么办,他就把字符也搞进来了,所以是1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,10(注意这里不是17,而是10哦,他的数值等同于十进制里的17),11,12。。。就不给大家展开说他怎么进的位了,大家思考一下应该不难发现的。十六进制虽然把字符搞进来了,但是他表达的还是数字。
   
    理论上想搞几进制都可以的,不过常用的就是二进制、八进制、十进制(现实生活)、十六进制、三十二进制
    那为什么会有二进制这种魔幻的东西存在呢?是因为电脑能看懂的其实只有0和1(也就是有电/没电),这个我在第二期有讲过一个相关的小笑话,大家可以去看看哈哈哈哈哈哈
    这里还有几个关于二进制的笑话
       “世界上只有10种人,一种是看得懂二进制的,一种是看不懂二进制的“

        “某幼儿园招生,园长问小朋友:会不会从1数到100啊?小朋友看了一眼园长说:1,10,11,100,数完了。园长扭头对家长说,你这孩子不适合来我们幼儿园,智商太低。孩子突然大吼:你丫才智商低!我懒得数一百个数,按照二进制数不行啊“(牛b
      
    然后其他的进制大家可能会听说过二、八、十六、三十二进制,隐隐约约有些规律哈,似乎都是二的多少次方,原因是这个二进制吧,他表达起来真的很长,比如我们常说的一个变量类型——整数,整数应该很好理解,就是没有小数点的那种。整数这种类型在编程里叫int型(因为整数的英文是integer),int型呢是由32个0或1组成的,那么1这个数字在电脑里存起来的样子是


0000 0000 0000 0000 0000 0000 0000 0001 (最左边的一位表达的是正负,0是正,1就是负)


可能大家会想问,左边那么多零能省略吗,不能,因为给int的储存格子大小是固定的,写不写0都占空间,所以得写。那为啥int的格子大小固定呢?因为电脑里的存储位置是连续的


我这么解释一下大家就能明白,比如说我们假设哈,说一个int变量长十厘米,然后现在我们要存a,b,c三个int变量到电脑里。然后a说,我左边都是零我不用十厘米那么大的地方,我要1厘米的空间就够了,好了那0cm-1cm这个位置是a的了,然后我们不是说电脑里的存储位置是连续的么(不连续也浪费空间是吧),那b占了1cm-11cm这个位置,c就是11cm到21cm的位置了。然后这时候我们对a进行操作了,我们把a变成了1111 1111 1111 1111 1111 1111 1111 1111,然后a说:电脑,我位置存不下了,现在0cm-10cm这位置都得是我的。此时b和c就不得不往后挪位置,如果他们会说话就会站出来说“靠,兄弟,你早干什么了,来搞心态吗
这就是为什么这些零不能省略

    所以大家可以想想,这个int能表达的最大的数是多少? 答案是2^31 - 1,也就是2的31次方减1个数(这里需要一点数学知识,但是如果搞不清楚为啥是次方也不要紧,这个没什么球用,我就不俄罗斯套娃了),当你存了一个超过这个值的数时,电脑就会报错说 溢出 啦,就是因为他已经表达不了。类比十进制的话,如果我们只有两位数的位置,也是表达不了100这个数字对吧。溢出这个概念是编程里一个比较重要的概念,简单来说就是装不下了

    但是呢,int能表达的最小的数,是 - 2 ^ 31,可能有人会问了,嘿,为啥和正的不对称啊?是这样的,我不是说这个最左边这一位表达正负么,那
    0000 0000 0000 0000 0000 0000 0000 0000 (全0)
    1000 0000 0000 0000 0000 0000 0000 0000 (左1)
    这俩分别表示+0和-0就离谱。。。。0就是0,哪来的正负。。。所以下头这个所谓的-0就被拿来表示 - 2 ^ 31这个数了,所以负数表达的范围,看似比正数多了那么一个


    扯远了,所以呢这个二进制的int型他又长又宽,就很不方便看,那我们切换一下进制
    二进制:1000 0000 0000 0000 0000 0000 0000 0001
    十六进制:8 0 0 0 0 0 0 1 (每4个二进制兑换一个十六进制)


    再来一组

    二进制:1111 1111 1111 1111 1111 1111 1111 1111
    十六进制:f f f f f f f f(每4个二进制兑换一个十六进制)

    是不是短了好多???是不是好清爽???这就是其他的和二进制成指数关系的进制(比如八进制和十六进制)为什么存在。。。
(其实现实生活中还有一个进制很常见,大家可以想想,结尾有答案








    好啦回归字符串这个正题,python这个字符串啊,其实不仅仅可以用双引号,也可以用单引号甚至三引号。我前段时间参加某银行的大数据职位面试的时候就被问到了这仨的区别,然后我一通胡乱猜测说错了。。。(结果还是拿到了offer哈哈哈哈哈哈


    那么到底区别是啥呢,其实单引号和双引号很接近啊,他们都能用,但是有个特殊的情况就是,如果碟中谍怎么办?就是说如果引号里套引号,层层套娃怎么办?python如何知道哪个是用来标示字符串边界的引号,哪个是字符串本身呢?


    比如我现在有一句字符串
        It's my life (里面出现了一个单引号
        那么此时我们分别用单引号和双引号把他框起来试试,结果就跟图里一样,单引号直接报错,因为python发现霍你搁这跟我套娃呢这么多个单引号,我哪知道哪个是标示字符截止了是吧。但是双引号就可以避免歧义
        

2

2

    那么我现在又有一句字符串
        He said "I love you" (里面出现了俩双引号
        来我们再来试试,这次就会发现用单引号可以正常的存入打印,但是双引号开始报错歧义了
        

3

3

    那么可能有人问了,那俩种我全都要怎么办
       He said "It's my life" (有单有双
        很简单啊,选单引号也行双引号也行,反正都避免不了歧义,直接上转义符哈,也就是回车键上面的那个\,让我们来试试就会发现完全正常哈打印出来的,python也很聪明的避开打印转义符了
        

4

4

    那三引号干啥呢,这货可就奇葩了,我原来以为他只是个跨行注释(python里常规注释用的是#,我也看到过很多次用三引号注释的)但是呢我搜了一下,他这个注释不是真的注释,他竟然是被当成字符串读进去的就离谱,而且最离谱的是,他对缩进是有要求的,所以乱写还会报错。。。用这个三引号大多数时候是为了字符串跨行的输入输出,这个用的太少了我就不给大家试了


    然后字符串的主要操作呢大概就是合并拼接啦,大小写修改啦,跨行啦,删除空白信息啦这些,书里都有我就不重复说了












实用小贴士(这一段是额外的小加餐,如果不看的话不影响目前学习的进度,看不懂的话也不要被这段搞坏心态)
    python删除空白信息这个需求贼实用啊,因为我们很多时候要自己处理输入信息,这个信息呢都是一长串中间隔着点空格啥的字符串,比如我现在输入一串分数,希望你存到一个列表(新名词,等同于大储物柜)里,然后再排序,我的输入长这样a = “100 40 60 65 34 77”
    那代码呢只需要一行
[Python] 纯文本查看 复制代码
b = list(map(int, a.split()))



    先别掀桌说看懂个锤子,让我慢慢给你讲这句话是干啥的
    首先我们先理理他的步骤,电脑不是人脑,人脑看过去就知道需要哪些数字了,但是电脑你就要一步一步的执行才可以,步骤如下:
  • 把a中的空格找出来,并以空格为分界线,把字符串分成一个个小字符串(注意哦,他们只是看起来像数字,其实还是字符串)
  • 把每一个小字符串,都转换成数字的格式,让电脑认得他们其实是数字
  • 把他们都存到一个列表(新名词,先不用着急理解,往下看)



    那么具体每一步怎么做呢

    第一步:
    我们如何从a里找到空格并切分呢?当然其实在我们之后学了for循环的概念后是可以自己写一串代码做到这个事的,但是python他好用就好用在有好多东西都写好了,他们都是一个个的小加工车间,你只要提供原材料,python就给你加工出来,不用白不用。那么做找到空格就切分的工作就要用到python里的小车间(准确说叫函数或方法;具体是函数还是方法我们暂不区分),书里教的是rstrip这个方法,实际写代码用的更多的是split这个车间(方法)。这个车间(方法)的输入是一串字符,输出会根据你想切割的位置,给切割成一小个一小个的字符
[Python] 纯文本查看 复制代码
a.split()


    当我们在a这个输入上调用了split时,split会开始为我们工作,他看到有空格(也可以指定别的字符),就会在空格处“切一刀”,此时a变成了
a = “100”, “40”, “60”, ”65“, “34”, ”77“(实际中间并没有逗号哈)
    但是此时呢,他们还不是数字,别忘了他们还是字符串。计算机和我们人脑不一样,我们会脑补他们是数字,但是计算机只认格式

    第二步:

    那么得到这一堆小字符串们后呢,我们就要转换一下格式,把他们变成计算机认可的数字。之前我们说过“整数这种类型在编程里叫int型”,所以想将字符串a转换为整数格式,只需要把它塞进int车间(函数)里,也就是
[Python] 纯文本查看 复制代码
int(a)

    但是这只转换了一个呀,别忘了我们的输入现在可是一长串,这时候就有另一个方法来解决,那就是mapmap可以迭代(可以理解为他是一个工人,会帮忙把数据一个一个的捡出来放到你指定的生产线里)的对每一个元素进行操作,那么此时我们只需
[Python] 纯文本查看 复制代码
map(int, a)

    a中的每一个元素就都会被map给转成了int,也就是整数的形式,那么现在a的形式是
    a = 100, 40, 60, 65, 34, 77(实际中间并没有逗号哈,只是为了区分每一个数字;数字是不带引号的,字符串才带)


    第三步:
    但是这时候其实还是不行,他们是一串数字,并不是一个数字a只是一个变量,他怎么能一对多同时表示这么多数字呢,就像是一个人怎么能有多个名字呢?他不能既叫张三又叫李四(外号除外啊)所以这时候就需要 列表 这个概念的出现了,这部分的只是在第三章(第三章就叫列表,好家伙)会详细讲,这里我们就简单理解一下
    列表可以理解为他是一个大储物柜,里面有很多小柜子所以可以放很多东西。换回到我们超市储物柜的概念的话,以前我们说a是一个变量,就像是储物柜其中的一个小柜子,我们给小柜子起名叫a,那么给a进行赋值就像是在小柜子里放东西。那列表呢,他可以代表整个储物柜,所以列表里面可以有很多个小柜子,每个小柜子都能放东西。那大家可能要问了,我怎么指定要对某个小柜子进行操作呢?列表是通过编号来的哈,比如a现在是一个储物柜(列表),有三个柜子(元素),那里面的三个小柜子就分别叫a[0], a[1], a[2] 这里要注意哈,在计算机里我们都是从0开始计数(是不是挺反人类)

    那么如何才能把这一串数字放到列表里呢,我们知道列表的单词是list,所以直接放到list车间(函数)加工一下就可以了

    所以只需要
[Python] 纯文本查看 复制代码
list(a)


   
那这三个步骤基本就介绍完了,再让我们看下开头的那句莫名其妙的咒语一样的一行代码
[Python] 纯文本查看 复制代码
b = list(map(int, a.split()))

现在知道他们在干啥了么~(其实我突然觉得这时候讲这部分好像有点早,感觉好多东西都还讲不太明白,大家凑合凑合看,就算有点理不清学到后边也就懂了


    然后就是为什么 list(a) map(a) 人家都是往括号里放输入 a.slipt() 是在后头点了个点,这里涉及到类和面向对象的思想,在后面八九章才会讲,现在就先大概知道有这么个东西就行了
这句代码简直是处理输入的神器
    那么下图就是实际效果

5

5








那么接下来是喜闻乐见的2.3节的课后题了,还是老话,不要看,代码看不进脑子,就得靠自己敲才能学会


2-3 个性化消息:将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消息应非常简单,如“Hello Eric, would you like to learn some Python today?” 。
    分析:这个主要考查的是变量的存储,这是上一期的内容了。再就是考察了字符串的拼接,这部分书里有介绍,不熟的话可以再去看一下
   
[Python] 纯文本查看 复制代码
name = "Sifang"  #申请一个小柜子(变量),把名字放进去print("Hello " + name + ", would you like to learn some Python today?")
#打印要求的信息,记得带上名字哦
#注意如果我们修改了第一行的名字,那么输出也会跟着变化


2-4 调整名字的大小写:将一个人名存储到一个变量中,再以小写、大写和首字母大写的方式显示这个人名。
    分析:这道题是比较简单的方法调用,也是书里详细讲过的,这些方法其实不是很常用,但是还是要知道他们的存在,万一以后需要了能想起来翻翻书就行
   
[Python] 纯文本查看 复制代码
name = "SiFang"print(name.lower())   #输出是 sifang
print(name.upper())   #输出是 SIFANG
print(name.title())   #输出是 Sifang


2-5 名言:找一句你钦佩的名人说的名言,将这个名人的姓名和他的名言打印出来。输出应类似于下面这样(包括引号) : Albert Einstein once said, “A person who never made a mistake never tried anything new.”
    分析:经典的输出打印,和第二期的内容相比,增加了一点歧义字符的难度,要学会活用python的单引号双引号还有转义符哦
   
[Python] 纯文本查看 复制代码
print('Albert Einstein once said, “A person who never made a mistake never tried anything new.”')#注意,因为字符串里面有双引号,所以我们可以用单引号将它扩起来避免出错
#当然也可以直接使用转义符\


2-6 名言 2:重复练习 2-5,但将名人的姓名存储在变量 famous_person 中,再创建要显示的消息,并将其存储在变量 message 中,然后打印这条消息。
    分析:2-3和2-5的拼接怪
   
[Python] 纯文本查看 复制代码
famous_person = "Albert Einstein" #我觉得我已经无需多言,大家都知道这一步在干啥了message = ' once said, “A person who never made a mistake never tried anything new.”' #依旧是避免引号歧义
print(famous_person + message) #字符串拼接,同2-3
#注意,当第一行与第二行内容修改时,输出也将跟着变化



2-7 剔除人名中的空白:存储一个人名,并在其开头和末尾都包含一些空白字符。务必至少使用字符组合"\t"和"\n"各一次。打印这个人名,以显示其开头和末尾的空白。然后,分别使用剔除函数 lstrip()、rstrip()和 strip()对人名进行处理,并将结果打印出来。
    分析:字符串的基本操作题,也是在考察对一些方法的调用熟练度
   
[Python] 纯文本查看 复制代码
name = "\n\tsifang  " #\n是换行,\t是按一次tab键的作用,也就是四个空格print(name) #输出是 空行,四个空格,sifang,两个空格
print(name.lstrip()) #输出是 sifang,两个空格
print(name.rstrip()) #输出是 空行,四个空格,sifang
print(name.strip()) #输出是 sifang
#注意这几个方法之间去除空格的区别哦
#不需要背下来,会用就行,需要的时候现查就可以了







那么这一期就结束啦~

之前提到说还有一个进制很常见,就是六十进制啦。当我们看时间的时候,每60秒是1分钟,每60分钟是1小时。。。所以他也算是个六十进制了
这个六十进制是来源于古巴比伦时期,据说为什么会出现六十进制,是因为人除去大拇指以外一个手指有3个指节,也就是一个手除了大拇指一共有3 x 4 = 12个指节,然后大拇指是用来指向每一个指节的,给个超级加倍5就是12x5 = 60了。所以就这么出现了60进制。

那么这一期我们主要学习了进制的知识字符串的操作,希望大家多多回顾,之前教的linux操作别忘了,这个很重要很实用




最后,我是鸽子,拖这么久是我的锅,欢迎大家继续催更(′;ω;`)

免费评分

参与人数 12吾爱币 +22 热心值 +10 收起 理由
搬砖孩子要毕业 + 1 谢谢@Thanks!
zhangshaohua + 1 + 1 谢谢@Thanks!
苏紫方璇 + 10 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
pzq134765 + 1 + 1 谢谢@Thanks!
天空宫阙 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
hit396 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
muzb + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
yangsenhappy + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Tea毒生灵 + 1 + 1 谢谢@Thanks!
吾爱支持 + 1 + 1 送上对热爱学习者的敬慕……
zengyi2020 + 1 热心回复!
qianwei766 + 1 + 1 已经处理,感谢您对吾爱破解论坛的支持!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

AsuraSong 发表于 2021-6-9 21:26
谢谢楼主分享,这是一个好的思路分享
现代文明侠 发表于 2021-6-9 21:27
qianwei766 发表于 2021-6-9 21:46
n1598k 发表于 2021-6-9 23:59
感谢楼主教程
nj2004 发表于 2021-6-10 05:37
感谢分享!
zhangjj001 发表于 2021-6-10 07:24
收听了!!!!!
Tea毒生灵 发表于 2021-6-10 07:51
学习一下  感谢感谢
紫藤,飘零叶 发表于 2021-6-10 08:01
感谢感谢
思桐yt 发表于 2021-6-10 08:36
来了来了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 15:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表