Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python基础类型(一):字符串和列表

python基础类型(一):字符串和列表

作者头像
渔父歌
发布于 2018-11-29 10:11:43
发布于 2018-11-29 10:11:43
1.2K00
代码可运行
举报
文章被收录于专栏:数据结构笔记数据结构笔记
运行总次数:0
代码可运行

一、字符串

与 C语言相比,Python没有字符类型,只有字符串类型。

Python中的字符串是用双引号或单引号包裹的一串字符。如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s = 'a'
s = 'aaa'
s = "a"
s = "aaa"
s = '"""'
s = "'''"
s = "''"''"

注意到最后三个的单双引号是嵌套使用的,但是最后一个的使用方法是错误的,因为当我们混合使用两种引号时必须有一种用来划分字符串的边界,即在两边的引号不能出现在字符串当中,否则 Python解释器会报错。

1. 截取字符串

其他的语言中一般将截取字符串定义为一个方法,比如 C语言中的 substr方法就可以返回字符串指定位置之间的一个字串。

但是在 Python中我们采用一种更简洁直观的方式,看如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s = "i_am_a_sher."

print('s is:', s)
print('s[0]: ', s[0])
print('s[1:]: ', s[1:])
print('s[1:3]: ', s[1:3])
print('s[1::2]: ', s[1::2])
print('s[-1]: ', s[-1])
print('s[-3:-1]: ', s[-3:-1])
print('s[-3::2]: ', s[-3::2])

'''
s is: i_am_a_sher.
s[0]:  i
s[1:]:  _am_a_sher.
s[1:3]:  _a
s[1::2]:  _mase.
s[-1]:  .
s[-3:-1]:  er
s[-3::2]:  e.
'''

在 Python中字符串被视为一个可迭代的对象,可迭代指实现了 iter接口,可以直接使用for t in object语法的对象,简单来讲可以把字符串看作一个存储字符的数组。

所以当我们打印s[0]时会将字符串的第一个字母打印出来。

Python还为字符串切片提供了非常便利的操作,比如:

s[1:]表示 s中第二个及以后的所有字符。

s[1:3]表示 s中第二个到到第四个字符之间的所有字符(包括前者但不包括后者,即包括第二个但不包括第四个)。

s[1::2]表示从 s中第二个字符开始取,每移动两个字符取一个,所以我们取到的结果是第 2、4、6、8、10个字符。

当给出的数字为负数时,表示从字符串的末尾开始计数,所以s[-1]表示字符串倒数第一个字符。

这里使用 -1表示倒数第一个字符,0表示正数第一个字符(因为没有 -0)。

::后面的数字为正时表示从左到右计数,为负数时表示从右到左计数。

2. 拼接字符串

拼接字符串我们直接使用+,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s_1 = 'aaa'
s_2 = 'bbb'
print('s_1 + s_2:', s_1+s_2)
"""
s_1 + s_2: aaabbb
"""
3.字符串的常用方法
  1. encode(str: codec)->bytes:接受一个编码字符串作为参数,返回编码后的二进制编码, 如:s.encode('utf-8')
  2. split(str: spl)->list:一给定的字符串 spl将原字符串分割为多个字串,并返回一个字串列表 如:s.split('_'),结果为:['i', 'am', 'a', 'sher']
  3. strip():去除字符串两端的空字符(包括换行、空格、制表符等其他不可见的符号),lstrip()rstrip()则分别去除字符串左边和右边的空字符。
  4. replace(str: old, str: new)->str:替换字符串中的某些字串,要替换的字串通过 old给出,用来替换的字串通过 new给出,如:s.replace('a', 'b')的结果为:i_bm_b_sher.
  5. join(list: l)->str:用原字符串将给定的列表拼接成一个字符串。 如:'_'.join(['i', 'am', 'a', 'sher.'])的结果就是i_am_a_sher..

二、列表

Python中的列表和数组类似,不过与数组只能存储一种元素相比,一个列表中可以存储任意元素,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
l = ['a', 1, ['a']]

在列表 l中我们存储了三种数据类型,分别是字符串、整数和列表

与数组相同的是,我们可以使用下表来访问列表中的元素,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
l[0]   # 'a'
l[1]   # 1
l[2]   # ['a']
l[3]   # IndexError

同样,如果访问了一个不存在的下标,程序就会抛出 IndexError错误。

1. 截取列表

截取列表的操作和截取字符串的操作完全相同,可以参考截取字符串。

2. 合并列表

合并列表可以像拼接字符串一样使用+将两个列表合并,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
l_1 = [1,2,3,4]
l_2 = [5,6,7,8]
l_3 = l_1 + l_2
# l_3 = [1,2,3,4,5,6,7,8]

也可以使用 extend(list: l)方法将要合并的列表直接追加到原来的列表后面。

注意:extend()方法没有返回值,这个方法直接在原来的列表上进行操作。

3. 列表的常用方法
  1. append(any: element):向列表尾部添加一个元素
  2. insert(any: element, int: index):向列表中特定的位置插入一个元素,原来在那个位置的元素及其后面的所有元素均向后移动一个位置。
  3. index(any: element)->int:返回所给元素在列表中从左到右第一个匹配的元素的位置,若所给元素不在列表中则抛出 ValueError错误。
  4. remove(any: value):将从左到右第一个匹配的元素从列表中移除,如果所给值不在列表中则抛出 ValueError错误。
  5. sort():将列表中的元素进行排序,直接在原列表中进行操作,没有返回值。
  6. pop():从列表的右边取出一个元素,并将该元素从列表中移除。
  7. reverse():反转列表,如: l = [1,2,3,4,5] l.reverse() # l = [5,4,3,2,1]
  8. 关键字 in的使用:可以用关键字 in来判断一个元素是否在列表中,如: l = [1,2,3,4,5] 1 in l # True 6 in l # False #可以使用 in和 index()配合来获取元素在列表中的位置 def indexOf(l, element): if element in l: index = l.index(element) else: index = -1 return index #可以使用 in和 remove()将元素从列表中移除 def remove(l, element): if element in l: l.remove(element) else: pass
  9. for遍历列表, 如: l = [1,2,3,4,5,6,7,8] # 如果要将 l中的元素逐个打印出来,其他的方法是: for i in range(len(l)): print(l[i]) # 但是在 python中不需要这么麻烦 for t in l: print(l)

三、练习

1. 日期格式转换

有多种日期格式:2018/10/28、2018.10.28、20181028、2018-10-28

现在我们需要编写一个程序将前三种格式转换为第四种格式。

要求:

  1. 不能使用 python类库
  2. 将代码封装成一个函数:date_trans(str: date)->str接受一个字符串输入,输出第四种日期格式
  3. 需要处理不规范输入引起的错误,当遇到不规范输入时抛出 ValueError错误并给出提示
2. 双向队列

现有函数签名:b_pop(list: l, str: direction)

该函数实现的功能是:当 direction的值为 'left'时从列表的左边取出一个元素返回,当 direction的值为 'right'时从列表的右边取出一个元素返回,当列表为空时返回 None

要求:

  1. 在取出元素前后列表原有的元素排列方向不变
  2. 当 l和 direction的值非法时抛出 ValueError错误并给出提示
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.10.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring 中 @Qualifier 注解还能这么用?
今天想和小伙伴们聊一聊 @Qualifier 注解的完整用法,同时也顺便分析一下它的实现原理。
江南一点雨
2023/09/09
1K0
Spring 中 @Qualifier 注解还能这么用?
从源码中看@Qualifier注解
@Qualifier注解通常和@Autowired注解一起使用,那么首先来看@Autowire是怎么把Bean对象注入到Spring容器中的。
关忆北.
2023/11/06
2270
从源码中看@Qualifier注解
Spring依赖注入(DI)核心接口AutowireCandidateResolver深度分析,解析@Lazy、@Qualifier注解的原理【享学Spring】
关于AutowireCandidateResolver接口,可能绝大多数小伙伴都会觉得陌生。但若谈起@Autowired、@Primary、@Qualifier、@Value、@Lazy等注解,相信没有小伙伴是不知道的吧。
YourBatman
2019/09/03
1.3K0
Spring依赖注入(DI)核心接口AutowireCandidateResolver深度分析,解析@Lazy、@Qualifier注解的原理【享学Spring】
【小家Spring】细说Spring IOC容器的自动装配(@Autowired),以及Spring4.0新特性之【泛型依赖注入】的源码级解析
前面我发布了Spring IOC容器的刷新(初始化)过程,以及Spring 容器的Bean的实例化、初始化过程。其中有一个步骤小伙伴们比较关心,也提问的比较多,那就是泛型依赖注入。鉴于之前对这一块描述得也不是很详细,鉴于此处还是比较重要的,因此本文专门用篇幅聊聊这个事
YourBatman
2019/09/03
3.8K0
【小家Spring】细说Spring IOC容器的自动装配(@Autowired),以及Spring4.0新特性之【泛型依赖注入】的源码级解析
Spring杂谈 | Spring中的AutowireCandidateResolver
接口定义 用于推断一个特定的beanDefinition是否能作为指定依赖的候选者的策略接口 ” public interface AutowireCandidateResolver { // 默认情况下直接根据bd中的定义返回,如果没有进行特殊配置的话为true default boolean isAutowireCandidate(BeanDefinitionHolder bdHolder, DependencyDescriptor descriptor) { return bdHolder
程序员DMZ
2020/07/06
6930
源码剖析Spring依赖注入:今天你还不会,你就输了
在之前的讲解中,我乐意将源码拿出来并粘贴在文章中,让大家看一下。然而,我最近意识到这样做不仅会占用很多篇幅,而且实际作用很小,因为大部分人不会花太多时间去阅读源码。
努力的小雨
2024/02/06
3120
Spring依赖注入@Autowired深层原理、源码级分析,感受DI带来的编程之美【享学Spring】
关于Spring IOC的依赖注入(DI机制),之前虽有过分析,但总感觉一直落了一块:对@Autowired注解元数据的解析部分。
YourBatman
2019/09/03
2.1K2
Spring依赖注入@Autowired深层原理、源码级分析,感受DI带来的编程之美【享学Spring】
【小家Spring】Spring标准处理组件大合集(ParameterNameDiscoverer、AutowireCandidateResolver、ResolvableType。。。)
本篇博文更像是一个工具文章,在阅读Spring源码的时候,经常会遇见一些处理器、提供器之类的组件,有的时候不深入去理解它的含义,确实还读不下去了。
YourBatman
2019/09/03
2K0
【小家Spring】Spring标准处理组件大合集(ParameterNameDiscoverer、AutowireCandidateResolver、ResolvableType。。。)
spring源码篇(四)依赖注入(控制反转)
​ 上一篇走了一遍bean的生成过程,也是spring容器启动的一个重要过程,而在这个过程中,有一个属性填充的步骤,也就是依赖注入,这个概念不难,但其底层实现其实却有很多复杂的步骤,使得这个依赖注入的功能比较强大,所以这篇就是从源码角度,了解spring的依赖注入功能。
用针戳左手中指指头
2021/03/22
7400
Spring源码解析(七):bean后置处理器AutowiredAnnotationBeanPostProcessor
冬天vs不冷
2025/01/21
2270
Spring源码解析(七):bean后置处理器AutowiredAnnotationBeanPostProcessor
【小家Spring】Spring贡献的多个注解相关的工具类:AnnotationUtils、AnnotatedElementUtils、AnnotationConfigUtils...
本文主要聊聊Spring提供的多个关于注解相关的工具类:AnnotationUtils和AnnotatedElementUtils等等 因为很多逻辑都封装在了工具类里面,因此要理解Spring的深层意思,有时候不了解工具类也是比较麻烦的
YourBatman
2019/09/03
3.7K0
【小家Spring】Spring贡献的多个注解相关的工具类:AnnotationUtils、AnnotatedElementUtils、AnnotationConfigUtils...
Spring源码学习:一篇搞懂@Autowire和@Resource注解的区别
最近在刷到很多文章讲解Spring IOC依赖注入时@Autowire和@Resource注解的区别,不同的文章总结出来的点有异同,所以还是看源码自己总结一下其两者的区别,及其用法。
@猪大肠
2023/02/16
2.1K0
Spring源码学习:一篇搞懂@Autowire和@Resource注解的区别
Spring Boot2.x-05Spring Boot基础-使用注解完成依赖注入
Spring Boot2.x-04Spring Boot基础-使用注解装配bean 中讲了如何将Bean装载到IoC容器中,这里我们说下Bean之间的依赖关系,当然了还是基于注解的方式。
小小工匠
2021/08/17
4170
Spring6框架中依赖注入的多种方式(推荐构造器注入)
一个典型的企业应用程序不是由单个对象(或在Spring术语中称为bean)组成的。
codetrend
2024/05/26
3550
《Spring实战》读书笔记-第3章 高级装配
《Spring实战》是学习Spring框架的一本非常经典的书籍,之前阅读了这本书,只是在书本上写写画画,最近整理了一下《Spring实战》的读书笔记,通过博客的方式进行记录分享。俗话说,好记性不如烂笔头,把学习到的知识记录下来,方便温故知新,让更多的读者可以学习到有关Spring框架的知识。
Java架构师必看
2020/04/10
6870
【小家Spring】Spring AOP核心类Pointcut解析,对PointcutExpression切点表达式解析原理分析(以AspectJExpressionPointcut为例)
首先需要说明一点:Pointcut接口有两个。 一个是:org.aspectj.lang.reflect.Pointcut,它是aspectj内部使用的。它只有一个实现类PointcutImpl。是它内部的抽象 另一个是:org.springframework.aop.Pointcut,这是Spring AOP体系中对切点的顶层抽象,贯穿整个AOP过程,非常重要。因此本文主要基于它,介绍一些原理以及它常用子类的一些使用。
YourBatman
2019/09/03
4.5K1
【小家Spring】Spring AOP核心类Pointcut解析,对PointcutExpression切点表达式解析原理分析(以AspectJExpressionPointcut为例)
Spring的@Autowired依赖注入原来这么多坑!
经常会遇到,required a single bean, but 2 were found。
JavaEdge
2021/12/07
6600
Spring的@Autowired依赖注入原来这么多坑!
Spring框架参考手册_5.0.0_中英文对照版_Part II_3.9
An alternative to XML setups is provided by annotation-based configuration which rely on the bytecode metadata for wiring up components instead of angle-bracket declarations. Instead of using XML to describe a bean wiring, the developer moves the configuration into the component class itself by using annotations on the relevant class, method, or field declaration. As mentioned in the section called “Example: The RequiredAnnotationBeanPostProcessor”, using a BeanPostProcessor in conjunction with annotations is a common means of extending the Spring IoC container. For example, Spring 2.0 introduced the possibility of enforcing required properties with the @Required annotation. Spring 2.5 made it possible to follow that same general approach to drive Spring’s dependency injection. Essentially, the @Autowired annotation provides the same capabilities as described in Section 3.4.5, “Autowiring collaborators” but with more fine-grained control and wider applicability. Spring 2.5 also added support for JSR-250 annotations such as @PostConstruct, and @PreDestroy. Spring 3.0 added support for JSR-330 (Dependency Injection for Java) annotations contained in the javax.inject package such as @Inject and @Named. Details about those annotations can be found in the relevant section.
Tyan
2019/05/25
1.3K0
Spring学习笔记(2)一DI依赖注入和Spring Bean配置、注解原理、动态注入
Spring容器是Spring框架的核心。容器将创建对象,它们连接在一起,配置它们,并从创建到销毁管理他们的整个生命周期。在Spring容器使用依赖注入(DI)来管理组成应用程序的组件。这些对象被称为Spring Beans。 IOC(Inversion of Control):传统的方法,当某个java对象A需要调用对象B时,是由调用者(对象A)通过new关键字来创建对象B的,而在Spring中,则是由spring完成创建的,所以“控制反转”了。Spring通过一种称作控制反转(IoC)的技术促进了低耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI(JNDI是 Java 命名与目录接口Java Naming and Directory Interface))相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。 DI(Dependency Injection)—IOC的另一种表述方式:即组件以一些预先定义好的方式(例如: setter方法)接受来自如容器的资源注入.相对于 IOC而言,这种表述更直接。
黄规速
2022/04/14
8440
Spring学习笔记(2)一DI依赖注入和Spring Bean配置、注解原理、动态注入
【小家Spring】Spring中@Value注解有多强大?从原理层面去剖析为何它有如此大的“能耐“
@Value注解是Spring3.0后提出来的一个注解。注解内容本身非常之简单,但是它提供的功能却非常之强大。
YourBatman
2019/09/03
5.3K0
【小家Spring】Spring中@Value注解有多强大?从原理层面去剖析为何它有如此大的“能耐“
推荐阅读
Spring 中 @Qualifier 注解还能这么用?
1K0
从源码中看@Qualifier注解
2270
Spring依赖注入(DI)核心接口AutowireCandidateResolver深度分析,解析@Lazy、@Qualifier注解的原理【享学Spring】
1.3K0
【小家Spring】细说Spring IOC容器的自动装配(@Autowired),以及Spring4.0新特性之【泛型依赖注入】的源码级解析
3.8K0
Spring杂谈 | Spring中的AutowireCandidateResolver
6930
源码剖析Spring依赖注入:今天你还不会,你就输了
3120
Spring依赖注入@Autowired深层原理、源码级分析,感受DI带来的编程之美【享学Spring】
2.1K2
【小家Spring】Spring标准处理组件大合集(ParameterNameDiscoverer、AutowireCandidateResolver、ResolvableType。。。)
2K0
spring源码篇(四)依赖注入(控制反转)
7400
Spring源码解析(七):bean后置处理器AutowiredAnnotationBeanPostProcessor
2270
【小家Spring】Spring贡献的多个注解相关的工具类:AnnotationUtils、AnnotatedElementUtils、AnnotationConfigUtils...
3.7K0
Spring源码学习:一篇搞懂@Autowire和@Resource注解的区别
2.1K0
Spring Boot2.x-05Spring Boot基础-使用注解完成依赖注入
4170
Spring6框架中依赖注入的多种方式(推荐构造器注入)
3550
《Spring实战》读书笔记-第3章 高级装配
6870
【小家Spring】Spring AOP核心类Pointcut解析,对PointcutExpression切点表达式解析原理分析(以AspectJExpressionPointcut为例)
4.5K1
Spring的@Autowired依赖注入原来这么多坑!
6600
Spring框架参考手册_5.0.0_中英文对照版_Part II_3.9
1.3K0
Spring学习笔记(2)一DI依赖注入和Spring Bean配置、注解原理、动态注入
8440
【小家Spring】Spring中@Value注解有多强大?从原理层面去剖析为何它有如此大的“能耐“
5.3K0
相关推荐
Spring 中 @Qualifier 注解还能这么用?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验