Preparatory Class-Day4-----序列类型(字符串、字节)

2024-05-12 11:38

本文主要是介绍Preparatory Class-Day4-----序列类型(字符串、字节),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、字符串
是一组由字符组成的序列,每一个字符都是字符串中的一个元素。
注意:不存在字符str,最小单位为字符串
字符串是不可修改类型(基本数据类型)
1. 字符串的创建-----单引号、双引号、三引号
• 单引号和双引号交替使用可以到输出双引号的和单引号的作用
• 三引号----自带换行
• 续行符“\”可以换行
• 空字符串        strnull =  '
2. 字符转义----(可以转义的字符由' " \)
在需要转义的字符前面添加“\”,对特殊字符进行转义

# 换行\n, \t, \r----换行,制表符,回车
b = 'nnnnn\n'

3. 字符串的操作(运算符、索引、切片)
(1) 运算符 ----   + * in  is < >
+ 合并的字符串(新创建字符串)
print('a'+'b')
* 重复
in/not in 值判断
print('a' in 'asdasda')
is/is not 对象判断
eg:
a = 'asd'
b = 'asd'
print(a is b)
< > <= >= 比较运算
print('a' < 'b')  # 比较ASCII码
*****
print('absdc' < 'abd') # 按照元素顺序,依次比较
(2) 索引----获取单个元素
格式: 变量名[index] 
· index的第一个元素是0,最后一个元素是-1
· index 为正数从左往右,负数从右往左
· index范围(-len(), len()-1)
· 字符串长度可以通过len()获得

(3) 切片----获得字符串中的多个元素
格式: 变量名[start:end:step],三个参数都可以省略
注意start方向问题
注意start对应字符输出、end对应字符不输出
[:] 提取从开头(默认位置0)到结尾(默认位置-1)的整个字符串
[start:] 从start 提取到结尾
[:end] 从开头提取到end - 1
[start:end] 从start 提取到end - 1
[start:end:step] 从start 提取到end - 1,每step 个字符提取一个左侧第一个字符的位置/偏移量为0,右侧最后一个字符的位置/偏移量为-1

Example:
a[:] # 整切片
a[0:]
a[-4:] # 切片索引可以越界
a[:4]
a[-5:-1]
a[-1:-5:-1]
a[::-1] # 颠倒

局部切片新创建对象,整体切片不新建对象
print(a is a[:]) ------ True
print(id(a), id(a[:]), id(a[1:4]) )

Practice:
使用切片工具,截取data中的年月日,data = '2018-06-28'
4. 字符串的相关方法
定义的字符串,相当于创建的一个str对象
s = 'fssdfgsdfg'
print(tpye(s))


a. count()统计一个字符在字符串中的数量
x 待统计自字符串
start 起始位置
end 结束为止默认从头到尾
# 几乎在所有包含start和end的地方都是包含start,不包含end

b.  index() 返回查找字串的位置,默认输出第一次子串出现为止
当查不到查找字串时报错
index(sub, start, end)
sub 为查找字串

c. find() 如果找不到,返回 -1
d. join() 将序列中的每一个元素,使用字符串拼接起来
# 填充元素在前,被填充序列在括号中
s = '123'
b = '-'
print(b.join(s))
e. replace(old, new, count) 
old 待替换字符串
new 要替换的字符串
count 不写全部替换,指定后从左往右替换,可以超出实际次数

# replace不修改原数据,而是新创建字符串存储

f. strip(chr) 剪切,按照传入的参数,去掉两端的对应字符串
chr 默认空格
剪切时按照剪切字符的所有单子符,从两端一直剪切到不存在符合字符为止

s = '    adasdferasda   '
print(s.strip('ad'))

# 左剪切 lstrip()
# 右剪切 rstrip()
g. split(sep, max) 切割:被切割的字符会去掉
sep 切割字符
max 最大切割次数
# 默认按照空格切割,返回值为列表类型

s = '    adasdferasda   '
print(s.split('er'))

对字符串的所有操作都不会原地去做(修改字符串),而是新建。
h. upper() / lower()  变成大写或小写
i. capitalize() 首字母大写
j. isnumeric() 判断字符串是否完全是数字[汉字数字返回True]
▪ 数字包括罗马数字、中文数字、Unicode数字、byte数字(单字节)、全角数字(双字节)
isdigit() 判断字符串是否完全是数字[汉字数字返回Flase]
isdecimal()
k. isalpha() 判断是否完全都是字符[中文/英文]
l. isidentifier() 判断字符串是否是合法标识符[变量名[字符、数字、下划线]、]
m. isupper() 判断是字符串内字母否完全是大写
islower()             判断是字符串内字母否完全是小写
isspace() 判断是否完全是空格
n. center(width, fillchar) 向两端填充字符,先左后右
width                  填充完毕后的宽度

fillchar                填充字符





二、字节
字节是一系列单字节的组合,每一个字节都是[0, 255](无符号)范围内组成。
单字节:一个字节8个数据位
字节也不支持修改(类似字符串、简单变量)


1. 字节的创建
b = b'abc'
c = b'打'   ---------  汉字报错,因为汉字不能以字节形式报错
8个数据位,最多存储256不同内容
2. 字节的操作 运算符、索引、切片
(1)     运算符 + - * / is in > 
eg:
print(b'abc' in b'abcsd')
print(b'abc' >= b'abcsd')
(2) 索引 索引显示ASCII码
eg:
print(b'b')

(3) 切片 切片显示字节

三、格式化 format: 
方便打印输出的时候显示


# 将数字格式化成字符串
方法1: %
s% == str()
print('jj %s' % 1)
print('jj %s %s' % (1, 3))


方法2:format

print("'jj', 'java', {}, {}".format(1,2,4))


# 字符串的引号使用
a = '''天行健,君子以自强不息;地势坤,君子以厚德载物。'''
print(a)
# 续行符可以换行
# 单引号和双引号交替使用可以输出引号
b = "天行健,'君子'以自强不息;\n"\'地势坤,"君子"以厚德载物。'
print(b)c = "天行健,'君子'以自强不息;\n"\'地势坤,\'君子\'以厚德载物。'
print(c)

# 切片练习
data = '2018-06-28'# 方法1:
Date = []
# 字符串切片
year  = data[:4]
mouth = data[5:7]
day   = data[8:]Date.append(year)
Date.append(mouth)
Date.append(day)
print(Date)
# 方法2:
# split()方法
# str.split(str分割符="", num分割次数=string.count(str))
year_new = data.split('-')
print(year_new)
# 作业
# 1.输出如下内容:分别使用双引号,和三引号
#   A:are you "tom"
#   B:no
def que1():print('第一题=========================\n')a = ''''A:are you "tom"B:no'''b = "A:are you \"tom\"\n"\"B:no"print(a , b)
que1()
# 2.定义两个字符串,a=“hello”  b=”hello”,令c=a,# 思考:是否能对a中的h进行修改# 输出abc三个变量的值# 使用is和==判断abc之间的关系,并画出内存图
def que2():print('第二题=========================\n')m = 'hello'n = 'hello't = mchang = input('To change \'h\' as what:\n')# 方式一:print(m.replace('h', chang, 1))# 方式二:idx = m.index('h')m_new = chang + m[idx:]print('m修改后的结果是:',m_new)# 方式三:print('6'+ m.strip('h'))############################# def namestr(obj, namespace = globals()):#     return [name for name in namespace if namespace[name] is obj]# import inspect# import re## def get_variable_name(variable):#     loc = locals()#把locals()方法移到函数内#     for key in loc:#         if loc[key] == variable:#             return loc###############################def judge(a, b):if a is b:return '{}和{}同一对象'.format(a, b)elif a == b:return  '{}和{}是同一值'.format(a, b)else:return '{}和{}没有关系'.format(a, b)print(judge(m, n))print(judge(m, t))print(judge(n, t))print(judge(m_new, t))que2()# 3.分别输入3个爱好,打印出来“我的爱好是**、**、**” ,
def que3():print('第三题=========================\n')#     使用格式化输出hobby1 = 'hiking'hobby2 = 'biking'hobby3 = 'computer'print('Method1:\n My hobby is {}, {} and {}'\.format(hobby1, hobby2, hobby3))print('Method2:\n My hobby is %s %s and %s' % (hobby1, hobby2, hobby3))
que3()# 4.这是一个地址,http://news.gzcc.cn/html/2017/xiaoyuanxinwen_1027/8443.html
# 其中1027/8443是新闻编号,想办法获得新闻编号。至少两种方法。def que4():print('第四题=========================\n')website = 'http://news.gzcc.cn/html/2017/xiaoyuanxinwen_1027/8443.html'# 去掉空格website = website.replace(' ', '')# 第一章方案:splitcut1 = website.split('_')cut1 = cut1[1].split('.')print('采用split方法:', cut1[0])# 第二种方案,切片(已知数字位数)cut_back = website[-13: -5]print('倒数位置固定的话,采用位数:', cut1[0])# 第三种方案,切片(倒数第一个反斜杠)lens = len(website)website_back = website[::-1]slash = website_back.index('/')result = website_back[slash-4 : slash+4]result = result[::-1]print('采用寻找倒数第一个‘/’方法:', cut1[0])# 第四种 stripwebsite_strip = website_back.strip('.html')website_strip = website_strip[-9:]print('采用strip方法:', website_strip)#第五种***********#  此处可以使用rfind(),可以倒着寻找索引slash = website.rindex('/')result = website_back[slash - 4: slash + 4]print('采用rindex/rfind方法:', result)
que4()# 5.做如下练习:
# # 1.输入一种水果,如葡萄
# # 2.打印类似“吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮”的效果   ---
# # 3.使用切片,切出自己输入的水果
# # 4.使用strip,剪切到自己输入的水果                    ---strip('吃皮'+fruit+'不吐').strip(',倒不吃')
# # 5.统计打印的的文本中,水果出现的次数                  ---count()
def que5():print('第五题=========================\n')fruit = input('>>>>>>step1\nPlease input a fruit name\n')# 替换lyric = '吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮'lyric_new = lyric.replace('葡萄', fruit)print('>>>>>>step2\nreplace方案:'+ lyric_new)# 格式化输出print('>>>>>>step2\nformat方案:'+'吃{}不吐{}皮,不吃{}倒吐{}皮'.format(fruit, fruit, fruit, fruit))# step3,切出水果# 模拟索引index()函数,寻找第一个相符点def my_index(lyric_new, fruit):index_list = []count= 0# 遍历句子,判断和水果名的比较for stri in range(len(lyric_new)-len(fruit)+1):for dexi in range(0, len(fruit)):# print(stri, lyric_new[stri + dexi], fruit[dexi],lyric_new[stri + dexi] == fruit[dexi])if lyric_new[stri + dexi] == fruit[dexi]:count += 1index_list.append(stri)# 计算出现次数count_total = count // len(fruit)# 修改出现位置列表index_list = index_list[::len(fruit)]# 切片获得随机一个fruitimport randomdex_redom = random.randint(0, len(index_list)-1)fruit_cut = lyric_new[index_list[dex_redom]:index_list[dex_redom] + len(fruit)]print('>>>>>>step3\n使用切片法获得的第{}个fruit为:{}'.format(dex_redom,fruit_cut))# 使用strip获得fruit名称lyric_new_split = lyric_new.split('不吐', 1)lyric_new_split = lyric_new_split[0].strip('吃')print('>>>>>>step4\n采用split方法获得的fruit名称:' + lyric_new_split)#输出print('>>>>>>step5\n在第{} / {} / {} / {}位置出现fruit'.format(index_list[0],\index_list[1], index_list[2], index_list[3]))print('出现次数: {}'.format(len(index_list)))return index_list, count_total, fruit_cut(my_index(lyric_new, fruit))# print('寻找+切片,得出结果:'+my_index(lyric_new, fruit)[1])
que5()


这篇关于Preparatory Class-Day4-----序列类型(字符串、字节)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/982524

相关文章

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G