百度飞桨领航团零基础Python速成营 课节二: Python编程基础

课节二

课程链接:https://aistudio.baidu.com/aistudio/course/introduce/7073

一、字符串进阶

1.字符串切片

2.字符串常用函数

count 计数功能

显示自定字符在字符串当中的个数

find 查找功能

返回从左第一个指定字符的索引,找不到返回-1,可寻找字符串,返回字符串首字母的索引

index 查找功能

返回从左第一个指定字符的索引,找不到报错

in 查找功能

返回一个布尔数

split 字符串的拆分

按照指定的内容进行分割

replace 字符串的替换

从左到右替换指定的元素,可以指定替换的个数,默认全部替换

strip 字符串标准化

默认去除两边的空格、换行符之类的,去除内容可以指定

upper,lower,title,capitalize 字符串的变形

msg = 'wO shI feI haI laO shI'
print(msg. title())           #以首字母大写的方式显示每个单词
print(msg. upper())           #以每个字母都大写的方式显示每个单词
print(msg. lower())           #以每个字母都小写的方式显示每个单词
print(msg. capitalize())      #把字符串的第一个字母转换成大写

二、字符串的格式化输出

百度飞桨领航团零基础Python速成营 课节二: Python编程基础_第1张图片

name = 'feihai'
hight = 180.5
score_math = 95
score_english = 89

print('大家好!我叫%s,我的身高是%d cm, 数学成绩%.2f分,英语成绩%d分' % (name, hight, score_math, score_english))

print('大家好!我叫{},我的身高是{:d} cm, 数学成绩{:.2f}分,英语成绩{}分'.format(name, int(hight), score_math, score_english))   #{:d}控制格式

print('Hello, {0}, 成绩提升了{2:.1f}分,百分比为 {1:.1f}%'.format('小明', 6, 17.523))     #{1:d}调位置  

print('Hello, {name:}, 成绩提升了{score:.1f}分,百分比为 {percent:.1f}%'\     
    .format(name='小明',                                                         #\换行
            score=6, 
            percent = 17.523))

#f-string  可读性最强
name = 'Molly'
hight = 170.4
score_math = 95
score_english = 89
print(f"大家好!我叫{name},我的身高是{hight:.3f} cm, 数学成绩{score_math}分,英语成绩{score_english}分")

三、list进阶

1.extend 合并列表

list1.extend(list2)              # list1 += list2, list2不变

可使用 list1 + list2 ,生成一个新列表,list1和list2的值不改变

2.list切片

list1 = [1,2,3,4,5,6,7]
list2 = list1[:4]               #获取列表前4个元素
list3 = list1[2:]               #获取列表从第3个以后的元素
list4 = list1[2:-8:-1]          #获取前3个元素,并逆序排列
list1[:2]=[10,20]               #可通过切片对列表赋值

3.复制list

list5=list1[:]                        #得到两个列表,可分别操作
list1.append('01')
list5.append('02')

可使用 list5 = list1 ,不过此操作指向同一个list,不可分别操作

四、列表生成式(列表解析)

list6 = [i**2 for i in range(1,11)]   创建1~10的平方数列表

格式为[表达式 for循环] , for循环用于提供值

*五、生成器

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

第一种方法:类似列表生成式

g = (x * x for x in range(10))

相当于创建了一个对象g,可通过

for n in g:
    print(n)

 print(next(g))

来获取g中的值

第二种方法:基于函数

def factor(max_num):
    # 这是一个函数  用于输出所有小于max_num的质数
    factor_list = []
    n = 2
    while n < max_num:
        find = False
        for f in factor_list:
            # 先看看列表里面有没有能整除它的
            if n % f == 0:
                find = True
                break
        if not find:
            factor_list.append(n)
            a = yield n     #a只是为了后文方便说明程序而建立的变量
            print('a = ',a)
            
        n += 1
        
g = factor(10)
print(next(g))
print('----------')
print(next(g))

上课时是第一次接触这个yield这个关键字,听的迷迷糊糊,课后翻阅了资料后有了自己的理解:

①若函数体包含yield关键字,调用函数,并不会执行函数体代码,得到的返回值即生成器对象

②直到程序执行print(next(g)),函数才开始执行,知道遇到yield关键字

③此时可以把yield当做return,return了一个2,程序停止,没有执行 赋值给a的操作, 此时next(g)语句执行完成

④程序执行print(’----------’)

⑤程序执行print(next(g)),与return不同的地方来了,这时候是从yield的地方开始执行的,也就是要执行a的赋值。这时候注意,赋值操作的右边是没有值的(因为刚才那个是return出去了,并没有给赋值操作的左边传参数),所以这个时候a赋值是None

⑥程序继续执行 n += 1 ,继续在while里执行,又一次碰到yield,此时同样return了一个3,然后程序停止。

⑦一直执行print(next(g)),就能获得一个列表,不过a的值永远为None

带yield的函数是一个生成器,而不是一个函数,这个生成器有一个函数就是next函数,next就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的,所以调用next的时候,生成器并不会从foo函数的开始执行,只是接着上一步停止的地方开始,然后遇到yield后,return出要生成的数,此步就结束。

简要理解,yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后开始。

感谢冯爽朗大佬的《python中yield的用法详解——最简单,最清晰的解释》中的解释,才让我理解了这个yield关键字。附上地址:冯爽朗:python中yield的用法详解——最简单,最清晰的解释

同时,若想要上面程序中a能赋值,可用到

send方法

send方法有一个参数,该参数指定的是上一次被挂起的yield语句的返回值

def factor(max_num):
    # 这是一个函数  用于输出所有小于max_num的质数
    factor_list = []
    n = 2
    while n < max_num:
        find = False
        for f in factor_list:
            # 先看看列表里面有没有能整除它的
            if n % f == 0:
                find = True
                break
        if not find:
            factor_list.append(n)
            a = yield n     #a只是为了后文方便说明程序而建立的变量
            print('a = ',a)
            
        n += 1
        
g = factor(10)
print(next(g))
print('----------')
print(next(g))
print('----------')
print(g.send(5))

执行print(g.send(5))时,将表达式(yield n)的返回值定义为send方法参数的值,即为5。然后a = yield n会将a的值置为5

总的来说,send方法和next方法唯一的区别是在执行send方法会首先把上一次yield语句的返回值通过参数设定。但是需要注意,在一个生成器对象没有执行next方法之前,由于没有yield语句被挂起,所以执行send方法会报错。

你可能感兴趣的:(python,python)