【卡码网Python基础课 11.句子缩写】

题目描述与分析

题目描述:
输出一个词组中每个单词的首字母的大写组合。

输入描述:
输入的第一行是一个整数n,表示一共有n组测试数据。(输入只有一个n,没有多组n的输入)
接下来有n行,每组测试数据占一行,每行有一个词组,每个词组由一个或多个单词组成;每组的单词个数不超过10个,每个单词有一个或多个大写或小写字母组成;
单词长度不超过10,由一个或多个空格分隔这些单词。

输出描述:
请为每组测试数据输出规定的缩写,每组输出占一行。

输入示例:
1
ad dfa fgs

输出示例
ADF

一、字符串大小的比较

在Python中,虽然没有字符这种类型,但我们仍然可以把字符串理解成由一个个字符组合而成的,比如字符串"hello", 是由字符’h’、‘e’、‘l’、‘l’、'0’组成的,我们可以通过索引来访问每一个字符。
在这里插入图片描述
字符之间比较大小是根据它们的Unicode码点值来执行的,这是一个整数值,用于唯一标识字符,比如小写字母’a’对应的Unicode码值是97, 小写字母’b’对应的 Unicode 码值是98, 字符按照它们的Unicode码点值进行排序,而这个值决定了字符在排序中的位置,因为我们可以根据这个值来进行字符之间的比较和排序。
可以使用Python的ord()函数来查找字符的Unicode码点值。

print(ord('A'))  # 输出 65
print(ord('Z'))  # 输出 90
print(ord('a'))  # 输出 97
print(ord('z'))  # 输出 122

实际上,小写字母从 ‘a’ 到 ‘z’ 对应的 Unicode 码值是从 97 到 122,而大写字母从 ‘A’ 到 ‘Z’ 对应的 Unicode 码值是从 65 到 90, 大小写字母之间的差值为32,所以可以通过数学运算将小写字符减去32后转换为大写字符。

二、代码编写

按照题目要求,我们应该先接收一个 整数 n, 表示共有 n 组测试数据,并让循环迭代 n 次,每次接收一行作为一个字符串。

n = int(input())  # 输入测试用例的数量

for _ in range(n):
    s = input()  # 输入一行字符串
    result = ''  # 定义变量result, 用来输出经过处理后的结果

在这里插入图片描述
题目要求是输出词组中每个单词首字母的大写组合,那么每行的第一个字符的大写形式会被拼接到result中,如果第一个字母是小写字符,则会被转换成大写再进行拼接。

在Python中判断字符是不是小写可以使用islower()方法,因此可以使用s[0]获取第一位字符,然后检查是否是小写字母。

可以使用upper()方法将字符串中的所有字符转换成大写字母。

# 如果首字母是小写,转换成大写
if s[0].islower():
    # 将之转换成大写,拼接在result中
    result += s[0].upper()
else:
    # 如果是大写,直接拼接在result中
    result += s[0]

然后从 s 的第二个字符开始遍历到倒数第二个字符(最后一个字符肯定不是一个单词,不需要拼接)。在循环中,检查当前字符是否为空格,并且下一个字符不是空格(这是为了跳过单词之间的多个空格),如果满足条件,则说明遇到了一个新的单词,下一个字符是这个单词的首字母,然后将下一个字符经过处理后添加到 result 中。

# 遍历整个字符串, 从索引1遍历到索引 len(s) - 1, 即最后一位字符(不包括该字符)
for i in range(1, len(s) - 1):
    # 如果当前字符是空格,下一个字符不是空格,说明下一个字符是新单词的首字母
    if s[i] == ' ' and s[i + 1] != ' ':
        # 判定新单词的首字母是否是小写,小写则转换成大写
        if s[i + 1].islower():
            # 将下一个字符经过处理后拼接到结果result中
            result += s[i + 1].upper()
        else:
            # 将下一个字符拼接到结果result中
            result += s[i + 1]

最后,通过 print 将处理后的结果输出到标准输出,每个字符串占据一行。

print(result)

完整代码如下:

n = int(input())  # 输入测试用例的数量

for _ in range(n):
    s = input()  # 输入一行字符串
    result = ''

    # 如果首字母是小写,转换成大写
    if s[0].islower():
        result += s[0].upper()
    else:
        result += s[0]

    # 遍历整个字符串
    for i in range(1, len(s) - 1):
        # 如果当前字符是空格,下一个字符不是空格,说明下一个字符是新单词的首字母
        if s[i] == ' ' and s[i + 1] != ' ':
            # 判定新单词的首字母是否是小写,小写则转换成大写
            if s[i + 1].islower():
                result += s[i + 1].upper()
            else:
                result += s[i + 1]

    print(result)

三、函数的定义

虽然上段代码能完成题目,但是在判定字符是否是小写形式的部分重复了一段。

# 如果首字母是小写,转换成大写
if s[0].islower():
    result += s[0].upper()
else:
    result += s[0]
      
# 判定新单词的首字母是否是小写,小写则转换成大写
if s[i + 1].islower():
    result += s[i + 1].upper()
else:
    result += s[i + 1]

如果后面还需要小写字符转换成大写字符,那么还需要再写,这种情况下可以自己创建函数(用户自定义函数),将代码模块化,并在合适的地方重用,从而增加代码的复用性和可维护性,下面我们就尝试写一个将小写字符转换成大写字符的函数。

定义一个函数之前,我们首先需要知道以下语法规则:

def 函数名(形参列表):
      函数体

def: 定义一个函数时,我们首先要在函数名之前放置这样一个关键字,是不可更改的,也不能缺少。
函数名: 我们会定义很多个函数,为了区分这些函数,我们要给不同的函数起不同的函数名称,而且函数命名是有规范的, 比如应该使用小写字母,并使用下划线_分隔单词。
(): 函数名之后的括号内填充的是参数列表,参数列表是传给函数的数据。
: 函数内容体以冒号 : 起始,并且缩进
函数体:函数体中可以有很多行代码,在这里,你可以编写程序的主要逻辑。函数体中通常会有一个return语句,表示函数的返回结果。

比如,我们想定义一个比较两个数大小的函数。

# max就是函数的名称,接收两个参数a 和 b
def max(a, b):
    # 函数体中的内容表示两个值的比较,如果 a > b
    if (a > b):
        # 函数返回的结果就是 a
        return a
    else 
        # 否则,函数返回的结果就是b
        return b
      
a = 10
b = 20
print(max(a, b)) # 将 a 和 b 传递到函数中,比较大小,最终返回b, 也就是20

如果想要定义一个将小写字符转换成大写字符的函数,需要满足以下条件:
函数名:可以自定义,这里使用change_char作为函数的名称
形参列表:函数接收一个小写字母作为参数,参数名称可以使用a来表示
返回值:函数返回一个大写字符

# 将小写字母转换成大写字母的函数
def change_char(a):
    # 如果 a 在 'a' 和 'z' 之间
    if 'a' <= a <= 'z':
        # 第一步:通过ord(a)获取unicode码值,然后减去32,表示对应的大写字母的unicode码值
        # 第二部:通过chr()函数将将Unicode码点值转换为对应的字符。
        a = chr(ord(a) - 32)
    # 返回字符a
    return a

chr() 函数返回一个Unicode码点值对应的字符,比如下面的示例:

char = chr(65)
print(char)  # 输出 'A'

将上面定义的函数change_char运用到之前的代码中:

# 将小写字母转换成大写字母的函数
def change_char(a):
    if 'a' <= a <= 'z':
        a = chr(ord(a) - 32)
    return a

n = int(input())
for _ in range(n):
    result = ""
    s = input()
    result += change_char(s[0])  # 将s[0]传递到参数进行处理,转换成大写字母
    for i in range(1, len(s) - 1):
        if s[i] == ' ' and s[i + 1] != ' ':
            result += change_char(s[i + 1])  # 将s[i+1]传递到参数进行处理,转换成大写字母
    print(result)

四、延伸:形参和实参

形参是在函数定义中指定的变量。它们是函数签名的一部分,并在函数体中作为局部变量使用。形参在定义函数时不赋值,它们的存在是为了指定该函数在被调用时应接受哪些数据(参数)。

例如,在下面的函数中,x 和 y 是形参:

def add(x, y):
    return x + y

这里的 x 和 y 是形式上的参数,它们定义了 add 函数应该接受两个输入值。

实参是在调用函数时传递给函数的具体值。实参可以是常量、变量或表达式。当函数被调用时,每个实参都会被用来填充相应的形参。

例如,在调用上面定义的 add 函数时,传入的 3 和 4 是实参:

result = add(3, 4)
print(result)  # 输出: 7

一般情况下,当函数执行时,实参的值会复制一份给形参,因此在函数中的修改只会影响形参的值,不会影响传递的实参。

def modify_value(x):
    x = x + 1
    print(x)

value = 10
modify_value(value) # 打印11
print(value) # 仍然是10

但是需要注意的是,如果实参是可变对象(例如,列表或字典),函数内的操作可能会影响到实参,这是因为在这种情况下,形参和实参引用的是同一个地址。

def modify_list(lst):
    lst.append(4)
    print(lst)

my_list = [1, 2, 3]
modify_list(my_list) # 列表将地址传给函数,函数中对列表进行append()操作,列表的内容改变
print(my_list) # [1, 2, 3, 4]

在这里插入图片描述

五、简易写法

因为Python的灵活性以及强大的字符串方法,我们还有另外一种思路,只需几行代码便可以完成功能,首先获取每一行的字符串,经过split()后,字符串已经被拆分成字符串列表了,我们只需要遍历这个字符串列表,取得每个字符串的首字母,然后转为大写字母就可以了。完整代码如下:

n = int(input())
for _ in range(n):
    words = input().split()
    result = ''
    # 遍历单词列表
    for word in words:
       # 取得每个单词的首字母,将之转为大写,然后拼接到result中
        result += word[0].upper()
    print(result)
  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值