<commit_before>7. 主任务：根据字符串，打印对应回文字符。
 
7.1 任务简介与分析  
任务是由用户输入一个字符串，比如'赏花归去马如飞'，程序会打出：  

```python
.
            
             赏
            赏赏  
           赏花赏  
          赏花花赏  
         赏花归花赏  
        赏花归归花赏  
       赏花归去归花赏  
      赏花归去去归花赏  
     赏花归去马去归花赏  
    赏花归去马马去归花赏  
   赏花归去马如马去归花赏  
  赏花归去马如如马去归花赏  
 赏花归去马如飞如马去归花赏  
赏花归去马如飞飞如马去归花赏
```

第一行的字数为1，最后一行的字数为字符串内字数的2倍，也是图形的行数。毫无疑问我们要从给定的字符串中依次取出字来，然后考虑如何设计组成每一行。  
可以将这个图形分成奇数行和偶数行分别分析，有如下规律：

 - 对第i(i>1)行(奇数行)，是字符串第(i//2-1)个字及之前的字符 + 字符串第(i//2)字 + 字符串第(i//2-1)个字及之前的字符的逆序。
 - 对第j行(偶数行)，是字符串第(j//2)个字及之前的字符 + 字符串第(j//2)个字及之前的字符的逆序。

7.2 序列之字符串(str)

从第一讲我们就接触到了字符串，无论是在`print()`函数中使用还是作为单行、多行注释来使用，以往均将字符串作为一个整体。事实上，字符串有一串字符组成，每个字符都有一个索引，索引从0开始，字符串是序列的一种，很多使用方法与列表(list)类似，字符串类型的关键字是`str`。

- 键入如下代码并观察执行结果。

```python
# 示例代码 1

line = str()
print('用str()初始化：', line == '')

line = 'abcdefghijklmn'
print('a' in line)
print('a' not in line)

for ch in line:
    print(ch)
    
print('--------------分隔线----------------')
for i in range(10):
    print(i, line[i])
```

- 可以利用循环求得字符串的长度(含有的字符数)

```python
# 示例代码 2

def my_len(line):
    len = 0
    for ch in line:
        len += 1
    return len

# 主程序，测试函数用
my_len('abcde')
```

实际上，由于求序列长度(内含对象个数)的需求十分频繁，python提供的内置方法`len()`不但可得到`list`对象所含元素个数，其实是可以得到**序列**对象所含元素个数，当然也包括`str`对象。

- 键入如下代码并观察执行结果。

```python
# 示例代码 3

words = ['1','2','3','1','2','3']
print(len(words))

line = 'abcdefg'
print(len(line))
```

回到本节任务中来，先考虑一种极端情况，如果给定字符串内所有的字都相同，这任务就好做了。

- 键入如下代码并观察执行结果。

```python
# 示例代码 4

line = '天天天天天天'
for i in range(1, len(line)*2+1):
    for j in range(1,i):
        print(line[0], end='')
    print()
```

已经有点儿接近我们想要的了，接下来需要构造一定数量规律的空格放到每行前面，需要数数计算一下。
- 键入如下代码并观察执行结果。

```python
# 示例代码 5

line = '天天天天天天'
for i in range(1, len(line)*2+1):
    for k in range(len(line)*2-i,0,-1):
        print(' ', end='')
    for j in range(1,i):
        print(line[0], end='')
    print()
```

好，对于极端的字符串内所有字都相同的情况，已经可以处理，但是稍显繁琐，python提供了更简单的方式。
- 键入如下代码并观察执行结果。

```python<commit_msg>Update 7.md<commit_after>7. 主任务：根据字符串，打印对应回文字符。
 
7.1 任务简介与分析  
任务是由用户输入一个字符串，比如'赏花归去马如飞'，程序会打出：  

```python
.
            
             赏
            赏赏  
           赏花赏  
          赏花花赏  
         赏花归花赏  
        赏花归归花赏  
       赏花归去归花赏  
      赏花归去去归花赏  
     赏花归去马去归花赏  
    赏花归去马马去归花赏  
   赏花归去马如马去归花赏  
  赏花归去马如如马去归花赏  
 赏花归去马如飞如马去归花赏  
赏花归去马如飞飞如马去归花赏
```

第一行的字数为1，最后一行的字数为字符串内字数的2倍，也是图形的行数。毫无疑问我们要从给定的字符串中依次取出字来，然后考虑如何设计组成每一行。  
可以将这个图形分成奇数行和偶数行分别分析，有如下规律：

 - 对第i(i>1)行(奇数行)，是字符串第(i//2-1)个字及之前的字符 + 字符串第(i//2)字 + 字符串第(i//2-1)个字及之前的字符的逆序。
 - 对第j行(偶数行)，是字符串第(j//2)个字及之前的字符 + 字符串第(j//2)个字及之前的字符的逆序。

7.2 序列之字符串(str)

从第一讲我们就接触到了字符串，无论是在`print()`函数中使用还是作为单行、多行注释来使用，以往均将字符串作为一个整体。事实上，字符串有一串字符组成，每个字符都有一个索引，索引从0开始，字符串是序列的一种，很多使用方法与列表(list)类似，字符串类型的关键字是`str`。

- 键入如下代码并观察执行结果。

```python
# 示例代码 1

line = str()
print('用str()初始化：', line == '')

line = 'abcdefghijklmn'
print('a' in line)
print('a' not in line)

for ch in line:
    print(ch)
    
print('--------------分隔线----------------')
for i in range(10):
    print(i, line[i])
```

- 可以利用循环求得字符串的长度(含有的字符数)

```python
# 示例代码 2

def my_len(line):
    len = 0
    for ch in line:
        len += 1
    return len

# 主程序，测试函数用
my_len('abcde')
```

实际上，由于求序列长度(内含对象个数)的需求十分频繁，python提供的内置方法`len()`不但可得到`list`对象所含元素个数，其实是可以得到**序列**对象所含元素个数，当然也包括`str`对象。

- 键入如下代码并观察执行结果。

```python
# 示例代码 3

words = ['1','2','3','1','2','3']
print(len(words))

line = 'abcdefg'
print(len(line))
```

回到本节任务中来，先考虑一种极端情况，如果给定字符串内所有的字都相同，这任务就好做了。

- 键入如下代码并观察执行结果。

```python
# 示例代码 4

line = '天天天天天天'
for i in range(1, len(line)*2+1):
    for j in range(1,i):
        print(line[0], end='')
    print()
```

已经有点儿接近我们想要的了，接下来需要构造一定数量规律的空格放到每行前面，需要数数计算一下。
- 键入如下代码并观察执行结果。

```python
# 示例代码 5

line = '天天天天天天'
for i in range(1, len(line)*2+1):
    for k in range(len(line)*2-i,0,-1):
        print(' ', end='')
    for j in range(1,i+1):
        print(line[0], end='')
    print()
```

好，对于极端的字符串内所有字都相同的情况，已经可以处理，但是稍显繁琐，python提供了更简单的方式。
- 键入如下代码并观察执行结果。

```python
{'fraction_non_alphanumeric': 0.17658829414707353, 'fraction_numerical': 0.022511255627813906, 'mean_word_length': 3.258785942492013, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '564130', 'n_tokens_mistral': 2863, 'n_tokens_neox': 3161, 'n_words': 270}