初始Python篇(6)—— 字符串

news2024/12/24 4:01:39

找往期文章包括但不限于本期文章中不懂的知识点:

个人主页:我要学编程(ಥ_ಥ)-CSDN博客

所属专栏: Python

目录

字符串的常见操作 

格式化字符串

占位符

f-string 

字符串的 format 方法 

字符串的编码与解码 

与数据验证相关的方法

字符串的拼接 

字符串的去重操作 


字符串的常见操作 

字符串是Python中的不可变数据类型,在最开始时,我们只是简单地学习了字符串的使用,并未深入研究。既然字符串也是一种数据类型,那么它是否也和前面学习的列表、字典、集合这些数据类型一样有着大量的操作方法呢?答案是有的,我们今天就来深入学习这些方法。

常见的操作字符串的方法
方法名说明
lower()将字符串str全部转成小写字母,结果为一个新的字符串
upper()将字符串str全部转成大写字母,结果为一个新的字符串
split(set=None)把str按照指定的分隔符sep进行分隔,分割之后的结果为列表类型,其中的元素便是被分割后的字符串
count(sub)结果为sub的这个字符串在str中出现的次数
find(sub)查询sub这个字符串在str中是否存在,如果不存在结果为-1,如果存在结果为sub首次出现的索引
index(sub)功能与find(相同,区别在于要查询的子串sub不存在时,程序报错
startswith(s)查询字符串str是否以字符串s开头
endswith(s)查询字符串str是否以字符串s结尾
replace(old, news)使用news替换字符串s中所有的old字符串,结果是一个新的字符串
center(width, fillchar)字符串str在指定的宽度范围内居中,可以使用fillchar进行填充
join(iter)在iter中的每个元素的后面都增加一个新的字符串str
strip(chars)从字符串中去掉左侧和右侧chars中列出的字符串
lstrip(chars)从字符串中去掉左侧chars中列出的字符串
rstrip(chars)从字符串中去掉右侧chars中列出的字符串

代码演示:

str = 'Hello Python'
print('开始一系列字符串操作')
lower_str = str.lower()
print('将字符串变成小写:',lower_str)
upper_str = str.upper()
print('将字符串变成大写:',upper_str)
list = str.split(' ')
print('以空格分割字符串:',list)
count = str.count('o')
print('字符串中"o"出现的次数:',count)
a = str.find('o')
b = str.index('o')
print('字符串中"o"出现的索引位置:',a,b)

print('字符串是不是以"hello"作为起始子串呢?',str.startswith('hello'))
print('字符串是不是以"Hello"作为起始子串呢?',str.startswith('Hello'))

print('字符串是不是以"python"作为结束子串呢?',str.endswith('python'))
print('字符串是不是以"Python"作为起始子串呢?',str.endswith('Python'))

运行结果:

 注意:在判断是否为起始子串、结束子串时,参数中的字符串不需要是子串,也可以是非子串。上述代码中的 "hello" 便是非子串。

 从上述的结果,也可以看出字符串的相关操作并不会改变字符串本身。简单理解就是 全都是生成一个新的字符列表对象,然后在这个列表中进行一系列的操作,然后改成新的字符串返回。

我们再来通过代码实现剩下的方法操作。

代码演示:

str = 'Hello Python'

# 替换字符串中的部分字符
print(str.replace('Hello','Hi')) # 在最后面还可以指定参数
print(str.replace('Hello','Hi',0)) # 指定替换0次,即不替换

# 填充部分字符,是字符串在指定的范围内处于居中位置
print(str.center(20)) # 在长度为20的空间中,默认使用空白字符填充,是字符串处于居中位置
print(str.center(20, '*')) # 在上面的基础上,使用"*"进行填充
print(str.center(10,'*')) # 当字符串本身超出 width 时,就直接打印输出

# 在字符串str后面的每个字符元素中,加上"  "(两个空格)
print('  '.join(str))

# 将 '  hhh  ' 中的空格全部去掉(默认是去掉空格),再使用'*'去替换空格
print('  hhh  '.strip().replace(' ','*'))
print('  hhh  '.replace(' ','*'))
# 观察上面两个的不同,或者写成下面这样

print('***hhh***'.strip('*')) # 直接将'*'从字符串中去除
print('***hhh***'.lstrip('*')) # 直接将左边'*'从字符串中去除
print('***hhh***'.rstrip('*')) # 直接将右边'*'从字符串中去除
# 注意下面这种情况,是不能成功去除的
print('*1**hhh***'.lstrip('*')) # 在去除'*'字符的过程中,遇到非'*'字符之后,就会停止去除

print('经过一系列的字符串操作之后,原字符串为:'+str)

运行结果: 

格式化字符串

常见的格式化字符串方式有三种:1、占位符的形式;2、f-string的形式;3、str.format()的形式。

占位符

在Python中常用的占位符有三个:1、%s -> 代指字符串;2、%d -> 代指十进制的整数;3、%f -> 代指浮点数。

语法格式:

# 可以理解为是将后面的参数直接带入到 %s、%d、%f 中
# 这里的 %s、%d、%f 只是占了个位置罢了,故名:占位符
# str % () --> 字符串 % 元组,占位符使用元组来替代
print('姓名: %s, 年龄: %d, 成绩: %f' % (name, age, score))

代码演示:

name = '马冬梅'
age = 18
score = 98.5

# 使用了 .1f 之后,可以让浮点数只输出一位
print('姓名:%s, 年龄:%d, 成绩:%f' % (name, age, score))
print('姓名:%s, 年龄:%d, 成绩:%.1f' % (name, age, score))

除了上述 .1f 之外,还有 5d 这种写法,小数点后面的是保证位数,小数点前面的是保证输出总长度,当总长度小于我们设置的总长度时,就会使用空格填充,如果是 5d 的写法,就是填充在左边,也就是右对齐;反之,如果是 -5d 的写法,就是填充在右边,也就是左对齐的写法。 scanf与printf函数的详细介绍及其用法_printf 换行符-CSDN博客 可以去看这篇文章,介绍的比较详细,虽然是C语言,但是概念是差不多的(输出格式)。

f-string 

语法格式:

# f-string ,使用的就是 fstring的形式
# 这里是把要使用变量替代的全部放到了{}中,这样在打印时,就会将{}中的变量替换为真实的值
print(f'姓名: {name}, 年龄: {age}, 成绩:{score}')

代码演示: 

name = '马冬梅'
age = 18
score = 98.5

# 使用f-string
print(f'姓名:{name}, 年龄:{age}, 成绩:{score}')

字符串的 format 方法 

语法格式:

# str.format() 与 f-string 有点类似,都是使用 {} 来标明需要替换的元素
# 但是 f-string 是直接从上文中取,而 str.format 是从format参数中寻找
# 0、1、2 对应的是 format参数中索引的位置,0 是 name的索引,所以就让 name 来替换0
print('姓名: {0}, 年龄:{1}, 成绩:{2}'.format(name, age, score))
# 下面的写法也是符合要求的,2 是 name的索引,所以使用name来替换2
print('姓名:{2}, 年龄:{1}, 成绩:{0}'.format(score, age, name))

代码演示:

name = '马冬梅'
age = 18
score = 98.5


# 使用字符串的format方法
print('姓名:{0}, 年龄:{1}, 成绩:{2}'.format(name, age, score))
# 上述的0、1、2指的是format方法中的参数的索引位置,可以写成下面这样
print('姓名:{2}, 年龄:{1}, 成绩:{0}'.format(score, age, name))

上面三种格式化的方式,写在一起的运行结果:

格式化字符串的详细格式还是有很多的,下面来认识其他的格式。

 代码演示:

s = 'Hello Python'
# 直接使用0去代指format中的参数
print('{0}'.format(s))
# : 是引导符,表明后面开始的操作是对参数的格式化
# * 是填充符,表明当长度不足时,使用 * 来填充
# < 是向左对齐、20 是字符串的总长度,不足时使用填充符来填充
print('{0:*<20}'.format(s))
# ^ 居中对齐、- 使用"-"填充空闲的位置
print('{0:-^20}'.format(s))
# 超出长度,就啥也不做
print('{0:*^5}'.format(s))
# 默认使用 空白字符 填充
print('{0:^20}'.format(s))

运行结果:

代码演示:

# 千位分隔符:只适用于整数与浮点数
# 且针对浮点数时,只会将其整数部分进行分割,而小数部分不会做任何处理
print('{0:,}'.format(1234567890))
print('{0:,}'.format(1234567890.987654321))

# .精度 ——> 参数为字符窜时,是显示最大的长度,参数为浮点数时,是显示小数的最大长度
# 针对字符串时,不需要加f,而针对浮点数时,需要加上f
print('{0:.2f}'.format(3.1415926535))
print('{0:.5}'.format('Hello Python'))

# 类型
a = 8
print('二进制:{0:b}'.format(a))
print('八进制:{0:o}'.format(a))
print('十进制:{0:d}'.format(a))
print('十六进制:{0:x}'.format(a))
print('十六进制:{0:X}'.format(a))

运行结果:

字符串的编码与解码 

我们现在所处的时代是互联网时代,通信的方式也是发生了变化。现在的通信主要是网络通信,一台机器上的数据经过一系列的处理变为了二进制数据,然后再通过网卡以二进制的形式传输出去(电信号的高低电平表示1与0、光信号的频率高低表示1与0) ,这些数据经过互联网就被另一台机器的网卡给接收到了,然后开始对二进制数据进行解析,变为最终通信的数据。上述过程就是不同机器的基本通信过程,如果想要详细了解,可以去看下面的文章。初始JavaEE篇 —— 网络编程(1):基础的网络知识-CSDN博客 

在Python中,将字符串的转换为二进制数据的过程就称为编码的过程;反之,将二进制数据转换为字符串的过程就称为解码的过程。

在Python中,编码所使用的方法是 encode,解码所使用的方法是 decode。

语法格式:

# encoding 是指定要编码的方式,默认是utf-8
# errors 是指定编码错误的处理方式,常见的有三种方式:
# 1、strict ——> 遇到编码错误时,直接抛出异常。这也是默认的处理方式
# 2、ignore ——> 直接忽略编码错误的字符,可以认为是直接跳过了这个字符,去处理后面的字符
# 3、replace ——> 用 ? 去代替编码错误的字符


str.encode(encoding='utf-8', errors='strict/ignore/replace')

bytes.decode(encoding='utf-8', error='strict/ignore/replace')

代码演示:

# 编码过程
s = 'Hello Python'
print('原始的数据:%s' % s)
s_encode = s.encode() # 都采用默认的方式
print('编码之后的数据类型:',type(s_encode))
print('编码之后的结果:',s_encode)

# 解码过程
s_decode = s_encode.decode() # 也是采用默认的方式
print('解码之后的结果:%s' % s_decode)

运行结果:

上面是对于英文的编码与解码演示,从结果上面来看就是在要传输的基础上加了个前缀b,同样对于数字字符串也是如此,下面我们来看看中文的编码与解码。

代码演示:

# 编码过程
s = '伟大的中国梦'
print('原始的数据:%s' % s)
s_encode = s.encode() # 都采用默认的方式
print('编码之后的数据类型:',type(s_encode))
print('编码之后的结果:',s_encode)

# 解码过程
s_decode = s_encode.decode() # 也是采用默认的方式
print('解码之后的结果:%s' % s_decode)

运行结果:

从上面的对比,我们可以得出一个结论:对于英文字符与数字在经过UTF-8编码后,是不变的,而大多数汉字字符在经过UTF-8之后,一个汉字字符对应着三个编码后的字符。 这是因为在UTF-8编码中规定的是大多数的中文字符占三个字节,而在传统的gbk编码中,中文是占两个字节的,因此使用不同的编码方式,最终形成的字节数也是不同的。

我们接下来就来看编码与解码的方式不同,会出现什么样的问题。

 当然我们也可以让其直接忽略或者是用?来替换

# 编码过程
s = '伟大的中国梦'
print('原始的数据:%s' % s)
s_encode = s.encode() # 都采用默认的方式
print('编码之后的数据类型:',type(s_encode))
print('编码之后的结果:',s_encode)

# 解码过程
# 采用ascii码值的方式去解码,并且对解码错误的处理方式采用忽略。
# 因为全部的编码都会解码失败,因此最终的解码结果就是啥也没有
s_decode = s_encode.decode(encoding = 'ascii',errors='ignore') 
print('解码之后的结果:%s' % s_decode)

运行结果:

下面是使用replace的结果:

与数据验证相关的方法

数据的验证是指程序对用户输入的数据进行“合法”性验证。主要是使用以下八种方法:

数据的验证
方法名说明
isdigit()所有的字符都是数字(只能是阿拉伯数字)
isnumeric()所有的字符都是数字
isalpha()所有的字符都是字母(包含中文字符)
isalnum()所有的字符都是数字或者字母(包含中文字符)
islower()所有的字符都是小写
isupper()所有的字符都是大写
istitle()所有的字符都是首字母大写
isspace()所有的字符都是空白字符(制表符(\t)、换行符(\n)等)

 代码演示:

# 判断所有的字符都是数字
# 下面依次是 阿拉伯数字、中文小写、罗马数字、中文大写、二进制数字
print('123'.isdigit()) # True
print('一二三'.isdigit()) # False
print('I'.isdigit()) # False
print('壹'.isdigit()) # False
print('b0101'.isdigit()) # False

print('-'*20)

# 判断所有的字符都是数字
# 下面依次是 阿拉伯数字、中文小写、罗马数字、中文大写、二进制数字
print('123'.isnumeric()) # True
print('一二三'.isnumeric()) # True
print('I'.isnumeric()) # False
print('壹'.isnumeric()) # True
print('b0101'.isnumeric()) # False

print('-'*20)

# 判断所有的字符都是字母
print('hello你好'.isalpha()) # True
print('hello你好123'.isalpha()) # False
print('hello 你好'.isalpha()) # False

print('-'*20)

# 判断所有的字符都是数字或者字母
print('hello你好'.isalnum()) # True
print('hello你好123'.isalnum()) # True
print('hello-你好-123'.isalnum()) # False
print('hello 你好'.isalnum()) # False

print('-'*20)

# 所有的字符都是小写
# 中文既是大写也是小写
print('hello'.islower()) # True
print('hello你好'.islower()) # True
print('Hello'.islower()) # False
print('HELLO'.islower()) # False

print('-'*20)

# 所有的字符都是大写
# 中文既是大写也是小写
print('hello'.isupper()) # False
print('hello你好'.isupper()) # False
print('Hello'.isupper()) # False
print('HELLO'.isupper()) # True

print('-'*20)

# 所有的字符都是首字母大写
# 通过 空格 来区分单词
print('Hello'.istitle()) # True
print('HelloWorld'.istitle()) # False
print('Helloworld'.istitle()) # True
print('Hello World'.istitle()) # True

print('-'*20)

# 所有的字符都是空白字符
print('   '.isspace()) # True
print('\n'.isspace()) # True
print('\t'.isspace()) # True
print('123\t'.isspace()) # False

字符串的拼接 

字符串的拼接是根据数据类型的不同,从而采取不同的方法。例如,当要拼接的数据类型是字符串本身时,完全可以使用 + 的直接拼接方法。

1、使用 str.join() 方法进行拼接字符串

2、直接使用"+"拼接字符串

3、使用格式化字符串进行拼接

代码演示:

s1 = 'hello'
s2 = 'python'

# 1、采用 str.join()方法
# 使用字符串的内容去替代参数中的元素之间的分隔符
print(''.join([s1, s2]))
print(''.join((s1, s2)))

# 2、直接拼接
print(s1+s2)
# 简单粗暴的方式
print('hello''python')

# 3、采用格式化字符串的方式
print(f'{s1}{s2}')
print('{0}{1}'.format(s1, s2))

运行结果:

字符串的去重操作 

当字符串中重复出现多个字符时,如果我们想去除重复的字符,拿到不重复的字符,就可以采用下面的方法。

1、遍历字符串,判断是否在新字符串中,不在则加上这个字符,最终遍历完成之后,得到的就是去重之后的字符串。

2、使用哈希的思想(就是使用集合),来去重。

代码演示:

s = 'hello worldhello worldhello worldhello world'
# 1、遍历+判断:
new_s1 = ''
for char in s:
    if char not in new_s1:
        new_s1 += char
print(new_s1)

new_s2 = ''
for i in range(len(s)):
    if s[i] not in new_s2:
        new_s2 += s[i]
print(new_s2)

# 2、哈希思想去重
new_s3 = set(s) # 得到的集合中只剩下不重复的元素了
# 但因为集合是无序的,因此我们按照原来字符串的顺序来排序,需要转化为列表
list_S = list(new_s3)
# 将列表中的字符按照字符串中的索引来进行排序
list_S.sort(key=s.index)
# 最终再转换为字符串类型
print(''.join(list_S))

运行结果:

好啦!本期 初始Python篇(6)—— 字符串 的学习之旅 就到此结束啦!我们下一期再一起学习吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Spring Boot+Vue的养老院管理系统【原创】

一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架Vue.js&#xff1b;UI库&#xff1a;ElementUI&#xff1b; 开发工具&…

Maven 中央仓库地址 mvnrepository.com

下载一些 jar 包驱动&#xff0c;不需用去官网下了&#xff0c;直接去 Maven 中央仓库&#xff0c;高效、简单 Maven 中央仓库地址 https://mvnrepository.com/open-source 我们下期见&#xff0c;拜拜&#xff01;

2024 年将 Postman 文档导出为 HTML 或 Markdown

2024 年将 Postman 文档导出为 HTML 或 Markdown

Anaconda安装库

相信有些人可能遇到pip直接安装失败&#xff0c;conda直接安装失败&#xff0c;pip镜像安装仍然失败的可能性&#xff0c;下面我记录一下我的一种解决方法。 我使用的是上面的miniconda3配置。 1.创建虚拟环境 首先&#xff0c;先新建一个虚拟环境 conda create -n py39 pyt…

linux命令详解,openssl+历史命令详解

openssl openssl是一个开源的加密工具包&#xff0c;提供了各种加密、解密、签名、验证等功能 openssl passwd -1 123password表示这个命令用于处理密码相关的操作&#xff0c;-1参数指定使用MD5加密算法对密码“123”进行加密处理。MD5是一种常用的哈希算法&#xff0c;它将…

Flink运行时架构以及核心概念

1.运行构架 1.提交作业后启动一个客户端进程&#xff0c;客户端解析参数&#xff08;-d -t 等等&#xff09;&#xff0c;后进行封装由Actor通信系统提交&#xff0c;取消&#xff0c;更新任务给JobManager。 2.JobManager&#xff08;进程&#xff09;通信系统一个组件叫分发…

解决C盘空间不足的三种方案

方案一&#xff1a;网上盛传的C盘磁盘碎片整理&#x1f9e9;&#xff08;原理&#xff1a;将分散的文件片段整理到相邻的磁盘区域&#xff0c;减少文件的碎片化程度&#xff09;(效果不明显) 方案二&#xff1a;把其他盘的空间给C盘 &#x1f4bd;&#xff08;效果显著&#xf…

echarts-gl 3D柱状图配置

1. 源码 此demo可以直接在echarts的编辑器中运行 option {title: {text: 产量图,textStyle: {color: rgba(255, 255, 255, 1),fontSize: 17},left: center},tooltip: {},legend: {show: false,orient: vertical,x: left,top: 0,right: 20,textStyle: {fontSize: 12}},visualM…

C++笔记---智能指针

1. 什么是智能指针 1.1 RALL设计思想 RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;资源获取即初始化&#xff09;是一种资源管理类的设计思想&#xff0c;广泛应用于C等支持对象导向编程的语言中。它的核心思想是将资源的管理与对象的生命周期紧密绑定…

「QT」几何数据类 之 QVector4D 四维向量类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

docker desktop运行rabittmq容器,控制台无法访问

docker desktop运行rabittmq容器&#xff0c;控制台无法访问 启动过程&#xff1a;…此处缺略&#xff0c;网上一大堆 原因 原因是在Docker上运行的RabbitMQ&#xff0c;默认情况下是没有启用管理插件和管理页面的 解决办法 使用命令 docker exec -it 容器id /bin/bash 进…

MySQL-事务(详细版)

目录 事务的含义 举一个例子 事务的特征&#xff08;面试高频&#xff09; 原子性 一致性 隔离性 持久性 事务结束 查看事务提交方式 查看事务提交的变量值&#xff1a;on 自动提交 off 不是自动提交 实例 事务回滚 验证事务回滚 事务实现&#xff1a;是数据库提…

Python “文件和IO操作” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业

本文主要是作为Python中“文件和IO操作”的一些题目&#xff0c;方便学习完Python的函数之后进行一些知识检验&#xff0c;感兴趣的小伙伴可以试一试&#xff0c;含选择题、判断题、填空题。 在做题之前可以先学习或者温习一下Python的异常处理机制&#xff0c;推荐阅读下面这篇…

【Docker】自定义网络:实现容器之间通过域名相互通讯

文章目录 一. 默认网络&#xff1a;docker0网络的问题二. 自定义网络三. nginx容器指之间通过主机名进行内部通讯四. redis集群容器&#xff08;跳过宿主机&#xff09;内部网络通讯1. 集群描述2. 基于bitnami镜像的环境变量快速构建redis集群 一. 默认网络&#xff1a;docker0…

Kafka-Eagle的配置——kafka可视化界面

通过百度网盘分享的文件&#xff1a;kafka-eagle-bin-2.0.8.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1H3YONkL97uXbLTPMZHrfdg?pwdsltu 提取码&#xff1a;sltu 一、界面展示 二、软件配置 1、关闭kafka集群 kf.sh stop 2、将该软件上传到/opt/modules下 cd /opt…

计算机图形学论文 | 木工设计与制造计划的共同优化

&#x1f98c;&#x1f98c;&#x1f98c;读论文 我们的系统共同探索离散设计变量和制造计划的空间&#xff0c;以生成&#xff08;设计&#xff0c;制造计划&#xff09;对的帕累托前沿&#xff0c;使制造成本最小化。在该图中&#xff0c;(a)是椅子的输入设计和仅探索该设计的…

【百日算法计划】:每日一题,见证成长(023)

题目 每日温度 请根据每日气温列表,重新生成一个列表,对应的位置的输出为:要想观测到更高的气温,至少需要等待的天数.如果气温在这之后都不再升高,则该位置用0代替. 例如,给定一个列表[73, 74, 65, 80,] 你的输出应该是[1, 2, 1, 0] 思路 首先&#xff0c;我们先来画图分析一…

【在Linux世界中追寻伟大的One Piece】多路转接epoll

目录 1 -> I/O多路转接之poll 1.1 -> poll函数接口 1.2 -> poll的优点 1.3 -> poll的缺点 1.4 -> poll示例 1.4.1 -> 使用poll监控标准输入 2 -> I/O多路转接之epoll 2.1 -> 初识epoll 2.2 -> epoll的相关系统调用 2.2.1 -> epoll_cre…

推动AI云产业向深向实,云·AI·算力创新发展大会即将启幕

近年来&#xff0c;以AIGC为代表的新兴技术正加速演进&#xff0c;全球站在智能化变革的起点&#xff0c;人工智能与云计算的深度融合&#xff0c;也驱动云计算进入第三次发展浪潮&#xff0c;迎来前所未有的机遇。 伴随AI的快速发展&#xff0c;2024年《政府工作报告》明确提…

5G 现网信令参数学习(3) - RrcSetup(1)

目录 1. rlc-BearerToAddModList 1.1 rlc-Config 1.1.1 ul-AM-RLC 1.1.2 dl-AM-RLC 1.2 mac-LogicalChannelConfig 2. mac-CellGroupConfig 2.1 schedulingRequestConfig 2.2 bsr-Config 2.3 tag-Config 2.4 phr-Config 2.5 skipUplinkTxDynamic 3. physicalCellG…