聪明办法学python(4)

发布时间 2023-12-02 20:38:35作者: 真的还没想好什么名字

聪明办法学python(4)

TASK 06 循环 LOOP

1.1 for循环

for x in range(m,n+1) #range(x,y)是左闭右开区间

1.2 range

range(n+1) #起始范围默认为0
range(m,n,k) #第三个参数为步长step
for x in range(5,20,7)  == (5 + 12 +19)
eg :只对从m 到 n 的奇数求和
def sum(m,n):
    total = 0
    for x in range(m,n+1):
        if x % 2 == 1:
            total += x
    return total
eg:从尾到头的range
for x in range(n,m-1,-1)
#以上写法不建议
for i in reversed(range(10,0,1))
#reversed反转

1.3 for循环的嵌套

def printCoordinates(xMax, yMax):
    for x in range(1, xMax+1):
        for y in range(1, yMax+1):
            print(f"( {x} , {y} )  ", end="")
 		print()
#多层循环运行极慢

eg:星号图

def Stars(n, m):
    # 输出一个 n*m 的星型矩阵图
    for row in range(n):
        for col in range(m):
            print("*", end="")
        print()
Stars(5, 5)
*****
*****
*****
*****
*****
#换一种写法
def printMysteryStarShape(n):
    for row in range(n):
        print(row, end=" ")
        for col in range(row):
            print("*", end=" ")
        print()
printMysteryStarShape(5)
0 
1 * 
2 * * 
3 * * * 
4 * * * * 

2.1 while循环

#我不知道什么时候停下来
def leftmostDigit(n):
    n = abs(n)
    while n >= 10:
        n = n//10
    return n 
#找出一个数最左边的数字

eg :

def isMultipleOf4or7(x):
    return ((x % 4) == 0) or ((x % 7) == 0)

def nthMultipleOf4or7(n):
    found = 0
    guess = -1
    while found <= n:
        guess += 1
        if isMultipleOf4or7(guess):
            found += 1
    return guess
#在知道循环范围时不应该使用while,而应该使用for

3.1 break与continue语句

for n in range(200):
    if n % 3 == 0:
        continue # 跳过这次循环
    elif n == 8:
        break # 跳出当前整个循环
    else:
        pass # 啥也不做,占位符(不会被运行)
    print(n, end=" ")
1 2 4 5 7 

eg:判断一个数是不是质数

def isPrime(n):
    if n < 2:
        return False
    for factor in range(2,n):
        if n % factor == 0:
            return False
    return True

def fasterIsPrime(n):
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    maxFactor = round(n**0.5)
    for factor in range(3, maxFactor+1, 2):
        if n % factor == 0:
            return False
    return True
#快了一点 但是只有结果正确才能提及算法快慢

4.1 合理的剪枝,缩小搜索范围/循环范围,可以大幅提高程序运行效率

TASK 07 字符串

1.1 字符串文字

#四种引号
#引号的作用就是将文字包裹起来,告诉 Python "这是个字符串!"
#单引号 ' 和双引号 " 是最常见的两种字符字符串引号
print('单引号')
print("双引号")
#三个引号的情况不太常见,但是它在一些场合有特定的作用,如doc-strings

我们为什么需要两种不同的引号?

print("聪明办法学 Python 第二版的课程简称是 'P2S'")
如果我们偏要只用一种引号,这会导致语法错误,Python 无法正确判断一个字符串的终止位置

1.2字符串里的换行符号

#前面有反斜杠 \ 的字符,叫做转义序列
print("Data\nwhale")  # \n 是一个单独的换行符号
Data
whale
#等价于
print("""Data
whale""")
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))
s = D\a"t	a

s 的长度为: 7

1.3一些字符串常量

import string
print(string.ascii_letters)
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

print(string.ascii_lowercase)
abcdefghijklmnopqrstuvwxyz

print(string.ascii_uppercase) 
ABCDEFGHIJKLMNOPQRSTUVWXYZ

print(string.digits)
0123456789

print(string.punctuation) # < = >
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

print(string.printable)
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ 	

print(repr(string.whitespace))
' \t\n\r\x0b\x0c'

1.4一些字符串的运算

print("abc" + "def")
print("abc" * 3)
abcdef
abcabcabc

print("ring" in "strings") # True
print("wow" in "amazing!") # False
print("Yes" in "yes!") # False
print("" in "No way!") # True
print("聪明" in "聪明办法学 Python") # True
True
False
False
True
True

1.5字符串的索引和切片

s = "Datawhale"
print(s)
print(s[0])
print(s[1])
print(s[2])
print(s[3])
Datawhale
D
a
t
a

print(s[0:4])
print(s[4:9])
Data
whale

print(s[0:2])
print(s[2:4])
print(s[5:7])
print(s[7:9])
Da
ta
ha
le


1.6翻转字符串

# 可以,但是不优雅
print(s[::-1])
elahwataD

# 优雅
def reverseString(s):
    return s[::-1]

print(reverseString(s))
elahwataD

1.7字符串的循环

for i in range(len(s)):
    print(i, s[i])
0 D
1 a
2 t
3 a
4 w
5 h
6 a
7 l
8 e


in 而不是for
for c in s:
    print(c)
D
a
t
a
w
h
a
l
e

#可以使用 enumerate() 获得元素的序号
for idx, c in enumerate(s):
    print(idx, c)
0 D
1 a
2 t
3 a
4 w
5 h
6 a
7 l
8 e

#zip(a, b) 可以在一次循环中,分别从 a 和 b 里同时取出一个元素
for a, b in zip(s, reverseString(s)):
    print(a, b)
D e
a l
t a
a h
w w
h a
a t
l a
e D

#用 split() 来循环

# class_name.split() 本身会产生一个新的叫做“列表”的东西,但是它不存储任何内容
class_name = "learn python the smart way 2nd edition"
for word in class_name.split():
    print(word)
learn
python
the
smart
way
2nd
edition

1.8格式化字符串

用 f-string 格式化字符串

x = 42
y = 99

print(f'你知道 {x} + {y} 是 {x+y} 吗?')
你知道 42 + 99 是 141 吗?

2.1基础文件操作

Python open() 函数用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数。

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

  • r:以字符串的形式读取文件
  • rb:以二进制的形式读取文件
  • w:写入文件
  • a:追加写入文件

2.2文件对象

open 函数会返回一个 文件对象。在进行文件操作前,我们首先需要了解文件对象提供了哪些常用的方法:

  • close( ): 关闭文件
  • 在 r 与 rb 模式下:read(): 读取整个文件;readline(): 读取文件的一行;readlines(): 读取文件的所有行
  • 在 w 与 a 模式下:write(): ; writelines():

2.3注意

  • 注意每次操作结束后,及时通过 close( ) 方法关闭文件,否则代码什么不会输出
  • w 模式会覆盖之前的文件。如果你想在文件后面追加内容,可以使用 a 模式操作

2.4 with语句

with open("ZenOfPy.py", "w", encoding="utf-8") as file:
    file.write(Caesar_cipher)
    print(len(Caesar_cipher))
1003

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