Python基础06字符串

###Chapter 6 字符串 Strings##



#字符串文字 四种引号

#引号的作用就是将文字包裹起来,告诉 Python "这是个字符串!"

#' 单引号 ' 和双引号 " 是最常见的两种字符串引号

#三个引号的情况不太常见,但是它在一些场合有特定的作用(如函数文档 doc-strings)

print('单引号')

print("双引号")

print('''三个单引号''')

print("""三个双引号""")

#为什么需要两种不同的引号

print(" Python 第二版的课程简称是 'P2S'")



##字符串中的换行符号

#前面有反斜杠 \ 的字符,叫做转义序列

# \n 代表换行,尽管它看起来像两个字符,但是 Python 依然把它视为一个特殊的字符

print("Data\nwhale")

print("""Data

whale""")###三引号可以多行输出

#可以在字符串后面使用 反斜杠 `\`  来排除后面的换行。让多行连着输出

print("""Data\

whale""")



##其他的转义序列

print("双引号:\"")##输出单引号

print("反斜线:\\")##输出反斜线

print("换\n行")

print("这个是\t制\t表\t符\n也叫\t跳\t格\t键")



#转义序列只作为一个字符存在



s = "D\\a\"t\ta"

print("s =", s)

print("\ns 的长度为:", len(s))



### repr() vs. print()

s1 = "Data\tWhale"

s2 = "Data      Whale"

print("s1:", s1)

print("s2:", s2)

print(s1 == s2)##False!!

print(repr(s1))

print(repr(s2))## repr()可以知道字符到底是什么




hack_text = "密码应当大于 8 个字符,小于 16 个字符,包含大写字母、小写字母、数字和特殊符号\t\t\t\t\t\t\t\t\t\t\t\t\t"

print(hack_text)

print(repr(hack_text))



#多行字符串作为注释

"""

接下来输出amzing

"""

print("amzing")



##一些字符串常量

import string

print(string.ascii_letters)##a-z A-Z

print(string.ascii_lowercase)##a-z

print(string.ascii_uppercase)##A-Z

print(string.digits)##0-9

print(string.punctuation) # 标点符号< = >

print(string.printable)

print(repr(string.printable))

print(string.whitespace)##空白字符

print(repr(string.whitespace))




#一些字符串的运算

#字符串的加减

print("abc" + "def")

print("abc" * 3)

print("abc" + "3")

print("ring" in "strings") # True

print("wow" in "amazing!") # False

print("Yes" in "yes!") # False

print("" in "No way!") # True

print("" in "Noway!") # True

print("聪明" in "聪明办法学 Python") # True



#字符串索引和切片

#单个字符索引,索引可以让我们在特定位置找到一个字符

s = "Datawhale"

print(s)

for i in range(len(s)):

    print("s[",i,"]:",s[i])

###正数从左往右数 正数索引



for i in range(-len(s),0):

    print("s[",i,"]:",s[i])

###负数从右往左数 负数索引



#用切片来获取字符串的一部分



print(s[0:4])###左闭右开区间0 1 2 3

print(s[4:9])



print(s[0:2])

print(s[2:4])

print(s[5:7])

print(s[7:9])



#切片的默认参数

print(s[:4])

print(s[4:])

print(s[:])



#切片的第三个参数 step

print(s[:9:3])

print(s[1:4:2])



#翻转字符串,可以,但是不优雅

print(s[::-1])



print("".join(reversed(s)))

##join函数依次添加

print("*".join(reversed(s)))

def reverseString(s):

    return s[::-1]

print(reverseString(s))



##字符串的循环

for i in range(len(s)):

    print(i, s[i])

for c in s:

    print(c)



#enumerate() 获得元素的序号

for idx, c in enumerate(s):

    print(idx, c)



#zip(a, b) 可以在一次循环中,分别从 a 和 b 里同时取出一个元素

for a, b in zip(s, reverseString(s)):

    print(a, b)



for idx, (a,b) in enumerate(zip(s, reverseString(s))):

    print(idx, a,b)



#用 split() 来循环

# class_name.split() 本身会产生一个新的叫做“列表”的东西,但是它不存储任何内容”



class_name = "learn python the smart way 2nd edition"

for word in class_name.split():

    print(word)



print(class_name.split())###列表




#用 splitlines() 来循环

# 跟上面一样,class_info.splitlines() 也会产生一个列表,但不存储任何内容

class_info = """\

聪明办法学 Python 第二版是 Datawhale 基于第一版教程的一次大幅更新。我们尝试在教程中融入更多计算机科学与人工智能相关的内容,制作“面向人工智能的 Python 专项教程”。

我们的课程简称为 P2S有两个含义:

Learn Python The Smart Way V2,“聪明办法学 Python 第二版”的缩写。

Prepare To Be Smart, 我们希望同学们学习这个教程后能学习到聪明的办法,从容的迈入人工智能的后续学习。

"""

for line in class_info.splitlines():

    if (line.startswith("Prepare To Be Smart")):

        print(line)

print(class_info.splitlines())###列表



##回文判断,如果一个句子正着读、反着读都是一样的,那它就叫做“回文”

def isPalindrome1(s):

    return (s == reverseString(s))

def isPalindrome2(s):

    for i in range(len(s)):

        if (s[i] != s[len(s)-1-i]):

            return False

    return True

def isPalindrome3(s):

    for i in range(len(s)):

        if (s[i] != s[-1-i]):

            return False

    return True

def isPalindrome4(s):

    while (len(s) > 1):

        if (s[0] != s[-1]):

            return False

        s = s[1:-1]

    return True

print(isPalindrome1("abcba"), isPalindrome1("abca"))

print(isPalindrome2("abcba"), isPalindrome2("abca"))

print(isPalindrome3("abcba"), isPalindrome3("abca"))

print(isPalindrome4("abcba"), isPalindrome4("abca"))



###一些跟字符串相关的内置函数

#str() 和 len()

name = input("输入你的名字: ")

print("Hi, " + name + ", 你的名字有 " + str(len(name)) + " 个字!")




#chr() 和 ord()

print(ord("A"))

print(chr(65))



print(

    chr(

        ord("A") + 1

    )

)##A后面的字母



print(chr(ord("A") + ord(" ")))###加减空格改变大小写



# 它可以正常运行,但是不推荐使用这个方法

s = "(3**2 + 4**2)**0.5"

print(eval(s))

#eval执行字符串里的表达式



def 电脑当场爆炸():

    from rich.progress import (

        Progress,

        TextColumn,

        BarColumn,

        TimeRemainingColumn)

    import time

    from rich.markdown import Markdown

    from rich import print as rprint

    from rich.panel import Panel




    with Progress(TextColumn("[progress.description]{task.description}"),

                BarColumn(),

                TimeRemainingColumn()) as progress:

        epoch_tqdm = progress.add_task(description="爆炸倒计时!", total=100)

        for ep in range(100):

            time.sleep(0.1)

            progress.advance(epoch_tqdm, advance=1)



    rprint(Panel.fit("[red]Boom! R.I.P"))

s = "电脑当场爆炸()"

eval(s) # 如果这是一串让电脑爆炸的恶意代码,那会发生什么

print(eval(s))




# 推荐使用 ast.literal_eval()

import ast

s_safe = "['p', 2, 's']"

s_safe_result = ast.literal_eval(s_safe)

print(s_safe_result)

print(type(s_safe_result))



#一些字符串方法

def p(test):

    print("True     " if test else "False    ", end="")

def printRow(s):

    print(" " + s + "  ", end="")

    p(s.isalnum())

    p(s.isalpha())

    p(s.isdigit())

    p(s.islower())

    p(s.isspace())

    p(s.isupper())

    print()

def printTable():

    print("  s   isalnum  isalpha  isdigit  islower  isspace  isupper")

    for s in "ABCD,ABcd,abcd,ab12,1234,    ,AB?!".split(","):

        printRow(s)

print(printTable())



print("YYDS YYSY XSWL DDDD".lower())

print("fbi! open the door!!!".upper())

print("   strip() 可以将字符串首尾的空格删除    ".strip())

print("聪明办法学 Python".replace("Python", "C"))

print("Hugging LLM, Hugging Future".replace("LLM", "SD", 1)) # count = 1

s = "聪明办法学Python, 就找 Datawhale"

t = s.replace("聪明办法", "")##删掉

print(t)

print("This is a history test".count("is"))

print("This IS a history test".count("is"))



print("Dogs and cats!".startswith("Do"))

print("Dogs and cats!".startswith("Don't"))



print("Dogs and cats!".endswith("!"))

print("Dogs and cats!".endswith("rats!"))



print("Dogs and cats!".find("and"))

print("Dogs and cats!".find("or"))#-1不存在



#用 f-string 格式化字符串

x = 42

y = 99

print(f' {x} + {y} 是 {x+y} ')



#其他格式化字符串的方法

#如果要格式化字符串的话,f-string 是个很棒的方法,Python 还有其他方法去格式化字符串:

#  % 操作

## format() 方法




#字符串是不可变的,必须创建一个新的字符串

s = "Datawhale"

#s[3] = "e" error

s = s[:3] + "e" + s[4:]

print(s)



#字符串和别名

#字符串是不可变的,所以它的别名也是不可变的

s = 'Data'  # s 引用了字符串 “Data”

t = s       # t 只是 “Data” 的一个只读别名

s += 'whale'

print(s)

print(t)




#基础文件操作 Open() 函数 打开一个文件,并返回文件对象

#open(file, mode) 函数主要有 file 和 mode 两个参数,其中 file 为需要读写文件的路径。mode 为读取文件时的模式,常用的模式有以下几个:

# r:以字符串的形式读取文件

# rb:以二进制的形式读取文件

# w:写入文件

# a:追加写入文件

file = open("chap6_demo.txt", "w")

dw_text = "Datawhale"

file.write(dw_text)

file.close()

file = open('chap6_demo.txt', 'r')

print(type(file))





#文件对象,open 函数会返回一个 文件对象

#close( ): 关闭文件

#在 r 与 rb 模式下:

#read(): 读取整个文件

#readline(): 读取文件的一行

#readlines(): 读取文件的所有行

#在 w 与 a 模式下:

#write():

#writelines():



## 通过 read 方法读取整个文件

content = file.read()

print(content)



## 通过 readline() 读取文件的一行

content = file.readline()

print(content)




## 关闭之前打开的 chap6_demo.txt 文件

file.close()

## 重新打开

file = open('chap6_demo.txt', 'r')

content = file.readline()

print(content)



## 以 w 模式打开文件chap6_demo.txt

file = open('chap6_demo.txt', 'w')

## 创建需要写入的字符串变量 在字符串中 \n 代表换行(也就是回车)

content = 'Data\nwhale\n'

## 写入到 chap6_demo.txt 文件中

file.write(content)

## 关闭文件对象

file.close()



###w 模式会覆盖之前的文件。如果你想在文件后面追加内容,可以使用 a 模式操作。



## 以 a 模式打开文件chap6_demo.txt

file = open('chap6_demo.txt', 'a')

## 创建需要追加的字符串变量

content = 'Hello smart way!!!'

## 写入到 chap6_demo.txt 文件中

file.write(content)

## 关闭文件对象

file.close()




##with 语句

import this



Caesar_cipher = """s = \"\"\"Gur Mra bs Clguba, ol Gvz Crgref



Ornhgvshy vf orggre guna htyl.

Rkcyvpvg vf orggre guna vzcyvpvg.

Fvzcyr vf orggre guna pbzcyrk.

Pbzcyrk vf orggre guna pbzcyvpngrq.

Syng vf orggre guna arfgrq.

Fcnefr vf orggre guna qrafr.

Ernqnovyvgl pbhagf.

Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.

Nygubhtu cenpgvpnyvgl orngf chevgl.

Reebef fubhyq arire cnff fvyragyl.

Hayrff rkcyvpvgyl fvyraprq.

Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.

Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.

Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.

Abj vf orggre guna arire.

Nygubhtu arire vf bsgra orggre guna *evtug* abj.

Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.

Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.

Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!\"\"\"



d = {}

for c in (65, 97):

    for i in range(26):

        d[chr(i+c)] = chr((i+13) % 26 + c)



print("".join([d.get(c, c) for c in s]))

"""

####解密码




with open("ZenOfPy.py", "w", encoding="utf-8") as file:

    file.write(Caesar_cipher)

    print(len(Caesar_cipher))

###with 会自动close



import ZenOfPy




#总结

#单引号与双引号要适时出现,多行文本用三引号。

#字符串中可以包含转义序列。

#repr() 能够显示出更多的信息。

#字符串本身包含许多内置方法,in 是一个特别好用的玩意。

#字符串是不可变的常量。

#文件操作推荐使用 with open("xxx") as yyy,这样就不用写 f.close() 啦。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值