集智专栏
资源加载中,请稍后...
集智专栏

[2018.03.13直播] Python之字符串+元组

Kaiser

直播地址:

1. 页内观看(仅视频)

2. 完整观看(可发弹幕):Python之字符串

3. Bilibili直播:Python之字符串


前情提要:

  • 字符串:

    • 单/双引号
    • 序列
    • 不可变
  • 常用方法

    • len():
    • .upper(): 切换大写
    • .lower(): 切换小写
    • .count(arg): 统计参数字符
    • .replace(arg0, arg1): 替换参数字符
  • ASCII

    • ord(): 字符->ASCII
    • chr(): ASCII->字符


23. 字符串操作

23.1 转义字符

反斜杠\在字符串中有特殊的含义,如果其后跟着某些字符,会产生特别效果,比如\n并不是打出一个反斜杠和n,而是将字符串换行。常见转义字符有:

程序说明
转义字符
示例代码
print('换\n行') print('制表\t符') print('反斜杠\\') print('单引号\'') print("双引号\"") # 如果代码过长,反斜杠用于续行 tmp_nb = 1 + \ 2 + \ 3 print(tmp_nb)


23.2 字符串运算

程序说明
字符串运算
示例代码
# 拼接 print("I'm " + "Chinese!") # 复制 print("逐梦" * 3 + "演艺" + "圈" * 12) # 逻辑 print("老婆" not in "老婆饼") print("人民" in "人民大会堂")


23.3 格式化

程序说明
格式化
示例代码
# %格式化 print("%d岁,%s" % (24, "学生") ) print("Pi的小数点前5位是%.5f" % 3.1415926535898) print("他的生日是%d\\%02d\\%02d" % (1921, 7, 1)) # .format()格式化 print("\n{}岁,{}".format(24, "学生") ) print("Pi的小数点前5位是{:.5f}".format(3.1415926535898)) print("他的生日是{}\\{:02d}\\{:02d}".format(1921, 7, 1)) # 参数顺序 print("\n如果{1}追到{0},我就和你嘿嘿嘿".format("你", "我")) # 对齐 print("{:^16}".format("嘿嘿嘿")) print("{:<16}".format("嘿嘿嘿")) print("{:>16}".format("嘿嘿嘿"))


24. 类型转换

24.1 字符串 <--> 列表

.split(): 以参数为分隔符,字符串生成列表 .join(): 以参数为分隔符,列表生成字符串

程序说明
.split()/.join()
示例代码
phrase_str = "风 评 被 害" phrase_lst = phrase_str.split(' ') print('.split() -> ', phrase_lst) print('.join() -> ', ' '.join(phrase_lst))


24.2 去除空格

.strip(): 去掉所有空格 .lstrip(): 去掉左侧空格(直至第一个非空格字符) .rstrip(): 去掉右侧空格(从最后一个非空个字符起)

程序说明
.strip()
示例代码
phrase = ' 乖 乖 站 好 ' print('strip() -> ', phrase.strip()) print('lstrip() -> ', phrase.lstrip()) print('rstrip() -> ', phrase.rstrip())


Quiz 15. 摩尔斯电码


你是一个黑客,现在需要一点启动资金,因此参与了非法交♂易,正当此时你收到了一段摩尔斯电码,请尽快解码以决定是否终止交易。

  • 摩尔斯电码的解码手册已经存在字典morse_decode中,morse_decode['.-'] = 'a', morse_decode['.'] = 'e', morse_decode['...---...']:'SOS'
  • 词之间的空格,去除两端空格
程序说明
解码摩尔斯
示例代码
morse_decode = {'.-': 'a', '-...': 'b', '-.-.': 'c', '-..': 'd', '.': 'e', '..-.': 'f', '--.': 'g', '....': 'h', '..': 'i', '.---': 'j', '-.-': 'k', '.-..': 'l', '--': 'm', '-.': 'n', '---': 'o', '.--.': 'p', '--.-': 'q', '.-.': 'r', '...': 's', '-': 't', '..-': 'u', '...-': 'v', '.--': 'w', '-..-': 'x', '-.--': 'y', '--..': 'z', '-----': '0', '.----': '1', '..---': '2', '...--': '3', '....-': '4', '.....': '5', '-....': '6', '--...': '7', '---..': '8', '----.': '9', '...---...': 'SOS'} def decode_morse(input_str): # >>>> show me the code <<<< return # >>>> show me the code <<<< print(decode_morse(' - .... . --.- ..- .. -.-. -.- -... .-. --- .-- -. ..-. --- -..- .--- ..- -- .--. ... --- ...- . .-. - .... . .-.. .- --.. -.-- -.. --- --. '))
正确答案
def decode_morse(input_phrase): input_phrase = input_phrase.split(' ') print(input_phrase) output_phrase = '' for i in input_phrase: if i == '': output_phrase += ' ' else: output_phrase += morse_decode[i] return output_phrase.lstrip().rstrip()
程序验证过程
decode_morse('. .') == 'ee' and decode_morse('...---...') == 'SOS' and decode_morse(' - .... . --.- ..- .. -.-. -.- -... .-. --- .-- -. ..-. --- -..- .--- ..- -- .--. ... --- ...- . .-. - .... . .-.. .- --.. -.-- -.. --- --. ') == 'the quick brown fox jumps over the lazy dog'
提示信息
去两端空格,用lstrip()/rstrip()


Quiz 16: 经纬度转换

你获得了弹道导弹和侦查卫星的控制权,但两套系统来自不同国家,有不同的数据格式,为了实现制霸全球的梦想,你需要编写一个程序来进行数据格式转换。


  • 来自侦查卫星的数据:'35.03299485527936', '33.233755230903625'
  • 弹道导弹的输入数据:('035*01\'58.781"N', '033*14\'01.519"E')
  • 度(degree, *)-分(minute, ')-秒(second, ")的进制是60
  • 注意数位即使不足,也需要用0填充

请完成函数convert_to_dms()的定义,发射弹道导弹。

程序说明
经纬度转换
示例代码
def convert_to_dms(dd_lat, dd_lon): # >>>> show me the code <<<< # >>>> show me the code <<<< return dms_lat, dms_lon print(convert_to_dms('35.03299485527936', '33.233755230903625')) print(convert_to_dms('-37.111415669561595', '-12.284317023586482'))
正确答案
def convert_to_dms(dd_lat, dd_lon): dd_lat = float(dd_lat) dd_lon = float(dd_lon) if int(dd_lat) >= 0: dir_lat = "N" else: dir_lat = "S" dd_lat = -dd_lat if int(dd_lon) >= 0: dir_lon = "E" else: dir_lon = "W" dd_lon = -dd_lon def convert60(x): return 60 * (float(x) - int(x)) ddd_lat = '%03d' % int(dd_lat) mm_lat = '%02d' % int(convert60(dd_lat)) ss_lat = ('%.3f' % convert60(convert60(dd_lat))).zfill(6) dms_lat = ddd_lat + "*" + mm_lat + "'" + ss_lat + '"' + dir_lat ddd_lon = '%03d' % int(dd_lon) mm_lon = '%02d' % int(60 * (dd_lon - int(dd_lon))) ss_lon = ('%.3f' % (60 * (60 * (dd_lon - int(dd_lon)) - int(mm_lon)))).zfill(6) dms_lon = ddd_lon + "*" + mm_lon + "'" + ss_lon + '"' + dir_lon return dms_lat, dms_lon print(convert_to_dms('35.03299485527936', '33.233755230903625')) print(convert_to_dms('-37.111415669561595', '-12.284317023586482'))
程序验证过程
convert_to_dms('19.61499312350978', '-155.48217818140984') ==('019*36\'53.975"N', '155*28\'55.841"W')
提示信息
度-分及分-秒的转换:60 * (float(x) - int(x))


25. 元组(tuple)

tuple与列表(list)很相似,但是不可变,也就是可散列(hashable)。

程序说明
Tuple
示例代码
# 空元组 empty_tuple = tuple() print(empty_tuple) # 新建元组 nb_tuple = (0,1,2,3) # 访问元素 print(nb_tuple[3]) # 修改元素 nb_tuple[3] = 4


25.1 逗号

虽然元组经常出现在括号()中,但括号其实并非必须,真正决定性的是逗号,。列表如果剥了壳[],就变成了元组。Quiz 16中convert_to_dms()的返回值:return dms_lat, dms_lon返回的实际上就一个元组。元组经常作为函数返回值出现,这在NumPy, TensorFlow等数值计算工具库中尤为常见。


25.2 元组赋值

“交换多个变量的值”,传统做法是借助中间变量,而元组赋值的功能则可以直接实现:

程序说明
元组赋值
示例代码
a = "了" b = "不" c = "得" b, c, a = a, b, c print(b, c, a)


25.3 元组与序列

  • zip()函数接收两个或多个序列,并联到一起,就像拉链一样。

程序说明
zip()
示例代码
string0 = '子丑寅卯辰巳午未戊己庚辛' string1 = '鼠牛虎兔龙蛇马羊猴鸡狗猪' nb_lst = [0,1,2,3,4,5,6,7,8,9,10,11,12] for pair in zip(nb_lst, string0, string1): print(pair)


25.4 元组与字典

程序说明
.items
示例代码
# 字典 -> 元组 sanguo_dct = {1:"吕", 2:"赵", 3:"典韦", 4:"关", 5:"马", 6:"张飞"} sanguo_tuples = sanguo_dct.items() print(sanguo_tuples) # 元组 -> 字典 print('\n', dict(sanguo_tuples))


Assignment

Quiz 17: DNA碱基对

你利用卫星和弹道导弹完成了全球同步爆破,现在地球已经完犊子了,你需要创造新的生命,以保证21世纪是生物的世纪。

  • DNA碱基成对存在,其中"A"和"T"配对, "G"和"C"配对。
  • 完成函数dna_strand()的定义,接收一条DNA,返回另一条。
  • 例如:dna_strand("GTAT") -> "CATA"
程序说明
DNA pair
示例代码
def dna_strand(dna): # >>>> sheng wu da fa hao <<<< # >>>> sheng wu da fa hao <<<<
正确答案
def dna_strand(dna): pairs = {'A':'T', 'T':'A', 'G':'C', 'C':'G'} return ''.join([pairs[i] for i in dna])
程序验证过程
dna_strand("ATTGC") == "TAACG" and dna_strand("GTAT") == "CATA"

您也许喜欢这些文章

集智专栏

玩儿懂深度学习Part 3:搭建深度神经网络

发表至系列教程
这是《玩儿懂深度学习》系列文章的第三篇,进一步详细介绍 Tensorflow 中 Keras 工具包提供的几种深度神经网络模块。
集智专栏

怎样用Python制作好玩的GIF动图

发表至趣味项目
可视化图表可以逼格更高一些吗?今天分享一下如何让可视化秀起来:用Python和matplotlib制作GIF图表。
集智专栏

Julia快速入门(中)

发表至系列教程
本文将介绍Julia中数组、字典和循环的相关知识。

文章评论(23)

Utaha 发表于 2月前回复
Quiz14中输出的结果并没有定义为('035*01\'58.781"N', '033*14\'01.519"E'),而是('035*01'58.781"N', '033*14'01.519"E'),为什么结果中会多出" \ "了?
新用户374 发表于 5月前回复
split()里面为啥不能以""为分隔符呢?就像perl里面split//这样的形式
京都蜜 发表于 5月前回复
dict = { 'A':'T', 'T':'A', 'C':'G', 'G':'C' } return "".join([dict[i] for i in dna])
Kaiser集智 站长 发表于 7月前回复
回复YAOYI:元组unhashable是因为元组内的元素不可以进行修改?那为啥可以直接交换值呢?
交换值其实是新建了一个元组
YAOYI 发表于 7月前回复
元组unhashable是因为元组内的元素不可以进行修改?那为啥可以直接交换值呢?
随风者zero 发表于 8月前回复
def dna_strand(dna): # >>>> sheng wu da fa hao <<<< dna_rule = {'A':'T','T':'A','G':'C','C':'G'} dna_new = '' for i in dna: dna_new += dna_rule[i] return dna_new dna_strand("GTAT")
游弋 发表于 8月前回复
dna_dict={"A":"T","T":"A","G":"C","C":"G"} r_dna='' for i in dna: if i in dna_dict: r_dna += dna_dict[i] else: r_dna += [i] return r_dna
cartman 发表于 8月前回复
def dna_strand(dna): rdna = '' for i in dna: rdna += dict_dna[i] return rdna
一只失踪_ 发表于 8月前回复
教程充满哲学的气息
新用户154 发表于 8月前回复
def dna_strand(dna): dna_tras='' for i in dna: if i == 'G': i = 'C' elif i == 'C': i='G' elif i == 'A': i = 'T' elif i == 'T': i='A'