字符串 、 字符串的格式化表达式、 字符串的常用方法 (method)、while 语句、语句嵌套

  • 回顾昨天知识

  • 表达式

    • 字符串

      'hello'
      
    • 数字

      100
      
    • 运算符

      • 算术运算符 + - * / // % **

      • 比较运算符

        <  <=   >   >=  ==   !=
        
      • 布尔运算

        and     or    not
        
      • 条件表达式

        左表达式 if 条件表达式 else 右表达式
        
    • 函数

      print(...)
      input(...)
      int(...)
      float(...)
      str(...)
      bool(...)
      
  • 语句

    • 赋值语句

      a = 100
      
    • 表达式语句

      表达式单独放在一行形成的语句叫做表达式语句

      print(a)
      
    • del 语句

      del a
      
    • pass 语句

      if True:
          pass
      
    • if 语句(复合语句)

      if  条件表达式1:
          语句块1
      elif 条件表达式2:
          语句块2
      elif 条件表达式3:
          语句块3
      elif 条件表达式n:
          语句块n
      else:
          语句块other
      
  • 运算符的优先级

    1 + 3 * 3 ** 2  + 4 // 2
    1 + 3 * 9 + 4 // 2
    1 + 27 + 4 // 2
    1 + 27 + 2
    28 + 2
    30
    
  • 运算符优先级表

运算符 描述
(expressions...),[expressions...], {key: value...}, {expressions...} 绑定或加圆括号的表达式,列表显示,字典显示,集合显示
x[index], x[index:index], x(arguments...), x.attribute 抽取,切片,调用,属性引用
await x await 表达式
** 乘方 5
+x, -x, ~x 正,负,按位非 NOT
*, @, /, //, % 乘,矩阵乘,除,整除,取余 6
+, - 加和减
<<, >> 移位
& 按位与 AND
^ 按位异或 XOR
` `
in, not in, is, is not, <, <=, >, >=, !=, == 比较运算,包括成员检测和标识号检测
not x 布尔逻辑非 NOT
and 布尔逻辑与 AND
or 布尔逻辑或 OR
if -- else 条件表达式
lambda lambda 表达式
:= 赋值表达式

字符串

  • 字面值(前期知识回顾)

    'hello'    "hello"     '''hello'''    """hello"""
    
  • 字符串转义

    \'     代表一个单个的 '
    \n     换行
    
  • 字符串的运算

    • 用于拼接字符串
    • 用于生成重复的字符串
  • 原始字符串(raw 字符串)

    以字符r开头的字符串, 其中的 \ 不算转义字符串

    字面值格式

    r'字符串内容'
    r"字符串内容"
    r'''字符串内容'''
    r"""字符串内容"""
    
  • in / not in 运算符

    • 作用

      in 用于序列,字符串,字典中,用于判断某个值是否存在于容器中,如果存在就返回True, 否则返回False

      not in 的返回值与 in 相反

    • 示例

      >>> s = 'welcome to beijing!'
      >>> 'to' in s
      True
      >>> 'weimingze' in s
      False
      >>> 'beijing' not in s
      False
      >>> 'weimz' not in s
      True
      
  • 字符串的索引 index

    • 语法

      字符串[整数表达式]

    • 作用

      用来获取字符串其中的一个字符

    • 说明

      正向索引: 字符串的 正向索引是从0开始的,.... 最后一个索引为 len(s)-1

      反向索引: 字符串的反向索引是从 -1 开始的,-1 代表最后一个,... -len(s) 代表第一个

    • 示例

      >>> s = 'ABCDE'
      >>> s[1]
      B
      >>> s[1+2]
      D
      >>> s[-1]
      E
      

      注: len(x) 函数可以求取一个字符串的长度

  • 练习

    写程序,输入一个字符, 打印字符串的如下内容
    1. 打印这个字符串的第一个字符
    2. 打印这个字符串的最后一个字符串
    3. 如果这个字符串的长度是 奇数,则打印中间这个字符
    用 len(x) 求字符串的长度

  • 字符串的切片 slice

    • 作用

      从字符串序列中取出相应位置的元素,重新组成一个新的字符串

    • 语法

      字符串[(开始索引b):(结束索引e)(:(步长s))]

      注: () 括起来的内容代表可以省略

    • 说明

      • 开始索引b是切片切下的开始位置

      • 结束索引e 是切片的终止位置(但不包含终止点)

      • 步长是切片取出数据后向后移动的方向和偏移量

        • 没有步长,相当于步长为1(默认为1)
        • 当步长为正数时,取正向切片
          • 开始索引默认为0, 结束索引是最后一个元素的下一个索引
        • 当步长为负数时,取反向切片
          • 开始索引默认为-1, 结束索引是第一个元素的前一个索引
    • 示例

      #   01234
      >>> s = 'ABCDE'
      >>> s[1:]    # 'BCDE'
      >>> s[-2:]   # 'DE'
      >>> s[1:4]   # 'BCD'
      >>> s[:]     # 'ABCDE'
      >>> s[:2]    # 'AB'
      >>> s[1:1]   # ''
      >>> s[4:2]   # ''
      >>> s[::]    # 等同于 s[::1] 'ABCDE'
      >>> s[::2]   # 'ACE'
      >>> s[2::2]  # 'CE'
      >>> s[-1::-2] # 'ECA'
      >>> s[::-1]   # 'EDCBA'
      
  • 练习1

    写一个程序,输入一个字符串,把字符串的第一个字符和最后一个字符去掉,打印处理后的字符串

  • 练习2

    输入一个字符串, 判断这个字符串是否是回文
    上海自来水来自海上
    ABCCBA
    13531

字符串的格式化表达式

  • 作用

    生成具有一定格式的字符串

  • 语法规则

    格式化字符串 % 参数1
    # 或者
    格式化字符串 % (参数1, 参数2, 参数3)

  • 占位符和类型码

占位符和类型码 说明
%s 转成字符串, 使用 str(x) 函数转换(常用)
%d 转成 十进制的整数(常用)
%o 转成 八进制的整数
%x,%X 转成 十六进制的整数
%e,%E 转成 指数格式的浮点数
%f,%F 转成小数格式的浮点数(常用)
%g,%G 转成指数格式或小数格式的浮点数
%% 转成一个%
  • 示例1

    >>> fmt = """
    甲方:_____%s_____
    乙方:_____%s_____
     ....... 金额:_%d__
    """
    >>> s = fmt % ("魏眀择", '达内', 10000)
    >>> print(s)
    
    甲方:_____魏眀择_____
    乙方:_____达内_____
     ....... 金额:_10000__
    
  • 示例2

    >>> "+++%d+++" % 999    # 返回 '+++999+++'
    '+++999+++'
    >>> "+++%s+++" % 3.14
    '+++3.14+++'
    >>> "+++%s+++" % "weimz"
    '+++weimz+++'
    >>> "+++%d+++" % 3.1415
    '+++3+++'
    >>> "+++%d+++" % 13
    '+++13+++'
    >>> "+++%o+++" % 13
    '+++15+++'
    >>> "+++%x+++" % 13
    '+++d+++'
    >>> "+++%e+++" % 3.1415
    '+++3.141500e+00+++'
    >>> "+++%f+++" % 3.1415
    '+++3.141500+++'
    >>> "+++%g+++" % 3.1415
    '+++3.1415+++'
    >>> "+++%g+++" % 3141523274812374281342374324.23748123742183472
    '+++3.14152e+27+++'
    
  • 占位符和类型码之间的格式化语法

    % [- + 0 宽度.精度] 类型码

    -左对齐
    + 显示正号
    0 左侧空白位置补零
    宽度: 整个数据输出的宽度
    精度: 保留小数点以后多少位(默认小数点以后保留6位)
    常用于 %d 和 %f 中

    • 示例

      >>> "--%d--" % 99
      '--99--'
      >>> "--%5d--" % 99
      '--   99--'
      >>> "--%05d--" % 99
      '--00099--'
      >>> "--%5d--" % 99
      '--   99--'
      >>> "--%+5d--" % 99
      '--  +99--'
      >>> "--%-5d--"  % 99
      '--99   --'
      >>> "--%f--" % 3.1415926
      '--3.141593--'
      >>> "--%.2f--" % 3.1415926
      '--3.14--'
      >>> "--%7.2f--" % 3.1415926
      '--   3.14--'
      
  • 练习

写一个程序:
输入一个字符串
输入一个浮点数
输入一个整数
输出: 全为10个字节宽度的字符串如下:
如:
请输入字符串: weimz
请输入浮点数: 3.14
请输入整数: 99
打印如下:
+------------+
| weimz |
| 3.14 |
| 0000000099 |
+------------+

答案见: 05_exercise_format.py

字符串的常用方法 (method)

  • 方法的调用语法

    对象.方法名(参数)

  • 示例:

    >>> "abc".isalpha() 
    True
    >>> "123".isalpha()
    False
    >>> "123".isdigit()
    True
    

    . 是"的"的意思

    • 字符串的常用方法
    方法名(S代表字符串对象) 说明
    S.isalpha() 判断字符串是否是英文字符
    S.isdigit() 判断字符串是否是全为数字
    S.isupper() 判断字符串是否是全为大写的英文字符
    S.islower() 判断字符串是否是全为小写的英文字符
    S.center(width[, fill]) 将字符串按width 宽度居中,左右默认填充空格
    S.count(sub[, start[, end]]) 获取字符串中的子串的个数
    S.startswith(prefix) 返回S是否以prefix 开头
    S.endswith(suffic) 返回S是否以suffic结尾
    str.replace(old, new[, count]) 替换字符串
    str.find(sub[, start[, end]]) 查找字符串,返回第一次出现的索引,如果没找到,返回-1
    str.index(sub[, start[, end]]) 查找字符串,返回第一次出现的索引,如果没找到则报错(从左向右开始找)
    str.rindex(sub[, start[, end]]) 查找字符串,返回第一次出现的索引,如果没找到则报错(从右向左开始找)

    [] 代表其中的内容弄可以省略

    详见: https://docs.python.org/zh-cn/3/library/stdtypes.html#string-methods

  • 示例:

    >>> s = "ABC"
    >>> s.center(10)
    '   ABC    '
    >>> s.center(10, '#')
    '###ABC####'
    >>> s = 'hello world, hello china'
    >>> s.count('hello')
    2
    >>> s.count('hello', 10)
    1
    >>> s.count('hello', 10, 12)
    0
    >>> s = "/root/music/冰雨.mp3"
    >>> s.startswith('/root/')
    True
    >>> s.endswith('.mp3')
    True
    >>> s.endswith('music')
    False
    >>> s = 'welcome to Beijing'
    >>> s.upper()
    'WELCOME TO BEIJING'
    >>> s.lower()
    'welcome to beijing'
    >>> s.title()
    'Welcome To Beijing'
    
    >>> s = '/root/music/冰雨.mp3'
    >>> pos = s.rindex('/')
    >>> pos
    11
    >>> pathname= s[:pos]
    >>> filename = s[pos+1:]
    >>> print(pathname)
    /root/music
    
    • 练习

      写一个程序,输入一个路径
      1) 打印出这个路径是否是在 /root 文件夹下
      2) 判断您的文件是否是 .sh 文件
      3) 如果是.sh 文件,如 xxx.sh, 则打印文件名 xxx
      如:
      请输入: /root/bin/abcd.sh
      1. 在 /root 下
      2. 是.sh 文件
      3. 文件名是: xxx

      请输入: /etc/ABCD.SH
      1. 不在 /root 下
      2. 是 .sh 文件
      3. 文件名是: ABCD

  • 语句回顾

    1. 表达式语句
    2. 赋值语句 name = input("xxxx: ")
    3. pass 语句
    4. if 语句
  • 循环语句

    • 种类

      • while 语句
      • for 语句
    • 问题:

      # 打印 10 行 hello world
      print("hello world!")
      

while 语句

  • 作用

    根据一定的条件,重复的执行某个语句块

  • 语法

while 真值表达式:
语句块1 (*此部分可能会重复执行)
else:
语句块2

  • 说明

    • else 子句可以省略
    • else 子句 当且仅当 真值表达式为假Flase的时候 会执行 else 里的语句块2
    • 如果 此 while 是因为 调用 break 语句而终止循环。则 else 子句里的语句不会执行
  • 示例1

    while 1 < 2:
    print("hello world")

  • 示例2

    # 打印 5 行 "hello world"
    i = 0
    while i < 5:
        print("hello world")
        i = i + 1  # 也可写成 i += 1
    else:
        print("while 语句已经结束!")
    
  • 练习1

    写一个程序,输入一个整数,写程序打印如下 n 行文字
    如:
    请输入: 10
    这是第 1 行
    这是第 2 行
    这是第 3 行
    ...
    这是第 10 行

  • 练习2

    写一个程序 打印1~20 的整数, 打印在 1 行内 每个数字之间用一个空格分隔开
    1 2 3 4 5 ... 19 20
    提示: print(x, end=' ')

语句嵌套

  • while 语句也是语句, 和其他的语句一样,可以嵌套到其他的任何复合语句中。

  • while 语句嵌套示意:

    while 真值表达式:
    ...
    while 真值表达式2:
    ...
    else:
    ...
    ......
    else:
    ...

  • 练习:

    写一个程序 打印1~20 的整数, 打印在 1 行内 每个数字之间用一个空格分隔开
    1 2 3 4 5 ... 19 20

    以上输入打印 10 行

break 语句

  • 作用

    用于循环语句(while, for语句)中, 当break 执行是,她会终止包含他的当前循环

  • 说明

    • break 语句只能用在 while 语句或for语句的内部.
    • break 语句通常和 if 语句组合使用.
    • 当break 语句执行后,此循环语句break 之后的所有语句都不会执行(else 子句里的语句也不执行)
    • break 语句只能终止包含他的当前循环,当有循环嵌套时,只能跳出离他最近的一个循环
  • 示例

    i = 1
    while i <= 5:
        print('i=', i)
        i += 1
    else:
        print('循环结束: i=', i)
    
  • 死循环

    • 死循环是指循环条件一直成立的循环
    • 死循环通常使用 break 语句来终止循环
    • 死循环的 else 子句中的语句永远不会执行
  • 写法

    while True:
    语句块

    死循环通常用于循环次数无法确定的循环

  • 练习1

    写程序,输入一个整数n , 代表结束的整数, 计算
    1 + 2 + 3 + 4 + ..... + n 的和
    请输入: 100
    5050
    # 提示:
    he = 0 # 用一个变量来记录这个和

  • 课后练习1:

写程序, 任意输入一些正整数, 当输入负数时结束输入,当输入完成后,打印您输入的这些数的和
如:
请输入: 1
请输入: 2
请输入: 3
请输入: 4
请输入: -1
您刚才输入的正整数之和是: 10

  • 课后练习2

打印 1~ 20 的整数, 每行打印 5 个, 打印 四行, 如:
1 2 3 4 5
6 7 8 9 10
...
16 17 18 19 20
# 提示: print() 换行

  • 课后练习3

已知, 局域网的IP 都是: 192.168.0.xxx
写程序,生成 从 192.168.0.1 ~ 192.168.0.254 区间的 254 个 IP 地址

  • 课后练习4

    已知, 局域网的IP 都是: 192.168.xxx.yyy
    xxx 从 0 ~ 10, yyy 从 1 ~ 254
    写程序,生成 从 192.168.0.1 ~ 192.168.10.254 区间的 2540 个 IP 地址
    # 提示用循环嵌套

    答案

    # 已知, 局域网的IP 都是: 192.168.xxx.yyy
    # xxx 从 0 ~ 10, yyy 从 1 ~ 254
    # 写程序,生成 从 192.168.0.1 ~ 192.168.10.254   区间的 2540 个 IP 地址
    # # 提示用循环嵌套
    
    xxx = 0
    while xxx <= 10:
     # 此处 xxx =0, 生成 1~254 的数,交给 yyy
        yyy = 1
        while yyy <= 254:
        # 生成 IP 地址
            ip = '192.168.%d.%d' % (xxx, yyy)
            print(ip)
            yyy += 1
        xxx += 1
    
  • 课后练习5

写一个程序,输入三行文字, 按最长的一行, 打印如下图形方框
请输入: hello
请输入: welcome to beijing
请输入: aaaaaaa
打印:
+--------------------+
| hello |
| welcome to beijing |
| aaaaaaa |
+--------------------+
提示: str.center(width)

答案

# 写一个程序,输入三行文字, 按最长的一行, 打印如下图形方框
# 请输入: hello
# 请输入: welcome to beijing
# 请输入: aaaaaaa
# 打印:
# +--------------------+
# |       hello        |
# | welcome to beijing |
# |       aaaaaaa      |
# +--------------------+
# 提示: str.center(width)

s1 = input("请输入:")   # ctrl + d 可以复制当前行
s2 = input("请输入:")
s3 = input("请输入:")

len1 = len(s1)  # 求取字符串的长度
len2 = len(s2)
len3 = len(s3)
# 从上面三个数中,找出最大的一个, 用 mymax 变量绑定
# 方法2, 通用的算法
mymax = len1

if len2 > mymax:
 mymax = len2

if len3 > mymax:
 mymax = len3

# 方法1
# if len1 > len2:
#     # 让 len1 和 len3 再比较
#     if len1 > len3:
#         mymax = len1
#     else:
#         mymax = len3
# else:
#     # 让 len2 和 len3 再比较
#     if len2 > len3:
#         mymax = len2
#     else:
#         mymax = len3
print('最大长度是:', mymax)

# 计算第一行
line1 = '+' + '-' * (mymax +2) + '+'
print(line1)
# 文字的第一行
# 方法1 , 用 str.center 居中文字的第一行
# center_s1 = '| ' + s1.center(mymax) + ' |'

# 方法2 , 用 自己的方法 居中文字的第一行
left_blanks = (mymax - len1) // 2   # 计算左侧的空格数
right_blanks = mymax - len1 - left_blanks   # 计算右侧的空格数
center_s1 = '| ' + ' ' * left_blanks + s1 + ' ' * right_blanks + ' |'
print(center_s1)

# 文字的第二行
center_s2= '| ' + s2.center(mymax) + ' |'
print(center_s2)
# 文字的第三行
center_s3 = '| ' + s3.center(mymax) + ' |'
print(center_s3)

# 打印最后一行
print(line1)

你可能感兴趣的:(字符串 、 字符串的格式化表达式、 字符串的常用方法 (method)、while 语句、语句嵌套)