day10 函數基礎

1.計算次數

"""

  1. count
    字符串1.count(字符串2) - 統計字符串1中字符串2出現的次數
    字符串1.count(字符串2, 開始下標=0, 結束下標=字符串1的長度) - 在字符串1中指定范圍內統計字符串2出現的次數
    """
    str1 = 'how are you? i am fine, Thank you! And you?'
    print(str1.count('you')) # 3

num = str1.count('you', 0, 11) # 1
print(num)

2.替換內容

"""
1)replace
字符串1.replace(字符串2, 字符串3) - 將字符串1中的字符串2全部替換成字符串3
字符串1.replace(字符串2, 字符串3, N) - 將字符串1中前 N 個字符串2替換成字符串3
"""
str1 = 'how are you? i am fine, Thank you! And you?'
print(str1.replace('you', 'me')) # how are me? i am fine, Thank me! And me?
print(str1.replace('you', 'me', 1)) # how are me? i am fine, Thank you! And you?

"""
2)expandtabs(拋棄)
字符串.expandtabs() - 將字符串中的制表符替換成 8 個空格(只針對下標是0的制表符有效,后面是 8 - 3)
字符串.expandtabs(N) - 將字符串中的制表符替換成 N 個空格 (只針對下標是0的制表符有效,后面是 - 3)

4 - 1
8 - 5
9 - 6
"""
str2 = 'Naa\tabc\t123'
new_str2 = str2.expandtabs(2)
print(str2, len(str2))
print(new_str2, len(new_str2))

將制表符替換成8個空格

new_str2 = str2.replace('\t', ' '*8)
print(new_str2)

3.字符串切割

"""
字符串1.split(字符串2) - 將字符串1按照字符串2為切割點進行切割
字符串1.split(字符串2, N) - 將字符串1按照字符串2為切割點進行切割,切 N 次
字符串1.rsplit(字符串2, N) - 將字符串1按照字符串2為切割點進行切割,切 N 次, 從后往前切
"""
str1 = 'how are you? i am fine, Thank you! And you?'
print(str1.split(' ')) # ['how', 'are', 'you?', 'i', 'am', 'fine,', 'Thank', 'you!', 'And', 'you?']
print(str1.split(' ', 2)) # ['how', 'are', 'you? i am fine, Thank you! And you?']
print(str1.rsplit(' ', 2)) # ['how are you? i am fine, Thank you!', 'And', 'you?']

'you' -> 'You'

'yOU' -> 'You'

4.刪除字符

"""
字符串1.strip() - 同時刪除字符串最左邊和最右邊的空白
字符串1.lstrip() - 刪除字符串中最左邊的所有空白
字符串1.rstrip() - 刪除字符串中最右邊的所有空白

字符串1.strip(字符串2) - 同時刪除字符串最左邊和最右邊的字符串2
字符串1.lstrip(字符串2) - 刪除字符串中最左邊的所有字符串2
字符串1.rstrip(字符串2) - 刪除字符串中最右邊的所有字符串2
"""
str3 = '\n\t abc 123\n 你好 \n'
print('============================')
print(str3)
print('============================')
print(str3.lstrip())
print('============================')
print(str3.rstrip())
print('============================')
print(str3.strip())
print('============================')

str4 = '1abc123'
print(str4.strip('
')) # 1
abc123
print(str4.rstrip('')) # 1abc123
print(str4.lstrip('
')) # 1abc123*

5.字符串查找

"""
字符串1.find(字符串2) - 獲取字符串2第一次在字符串1中出現的位置(用正的下標值表示),如果找不到返回 -1
字符串1.find(字符串2, 開始下標, 結束下標)
"""
str1 = 'how are you? i am fine, Thank you! And you?'
print(str1.find('you')) # 8

練習1:寫代碼實現查找字符串str1中所有的 'you'出現的位置

start_index = 0
indexs = []
while True:
index = str1.find('you', start_index)
if index == -1:
break
start_index = index + 3
indexs.append(index)
print(indexs)

6.拼接

"""
字符串.join(容器) - 將容器中元素用指定字符串連接在一起(容器中的元素是字符串)
"""
list1 = ['余婷', '駱昊', '肖世榮']
new_str = ' and '.join(list1)
print(new_str)

new_str2 = '+'.join('abc')
print(new_str2)

練習2:用列表推導式實現將任意容器中的元素用join進行連接

nums = [10, 20, '30', True]

print('+'.join(nums)) # TypeError: sequence item 0: expected str instance, int found

nums = {'name': '余婷', 'age': 18, 'sex': '女'}
new_str3 = ' '.join([str(x) for x in nums.values()])
print(new_str3)

字符串中某一個或者多個部分不確定就可以用格式字符串來實現功能

name = input('姓名:')

name = '張三'

age = int(input('年齡:'))

age = 18

message = 'XXX今年XX歲!'

message = name+'今年'+str(age)+'歲!'
print(message)

1.格式占位符

"""
語法:
包含格式占位符的字符串 % (數據1, 數據2, 數據3, ...)

說明:
a. 數據個數和前面占位符的個數保持一致
b. 格式占位符:
%d - 整數
%Nd/%-Nd - 整數填充字符串的時候寬度是N,不夠的用空格在前面/后面占位

%f  -  小數
%.Nf - .N表示保留N位小數

%s  -  字符串

注意:一般情況下占位符和數據的類型需要保持一致,只有 %s 可以用任何類型的數據填充
"""
message = '%s今年%-5d歲,年薪:%.2f' % (name, age, 20000)
print(message)

2.format

"""
在字符串中通過 {} 來占位表示字符串中變化的部分

  1. 數據的個數和 {} 的個數保持一致
    """
    message = '{}今年{}歲!'.format(name, age)
    print(message)

"""

  1. 下標形式的format: {下標}
    """

'你好我是XXX。 XXX你好!'

message = '你好我是{0}。{0}你好!'.format(name)
print(message)

str1 = '{1}={0}={1}'.format(10, 20)
print(str1) # 20=10=20

str2 = '{1}={2}={0}={1}'.format(1, 2, 3, 4)
print(str2) # 2=3=1=2

"""

  1. key形式的format: {key}
    """
    str3 = '{0}今年{1}歲,{0}的得分是:{2}'.format('張三', 18, 78)
    print(str3)
    str3 = '{name}今年{age}歲,{name}的得分是:{score}'.format(name='張三', age=18, score=78, height=180)
    print(str3)

"""

  1. f(format)字符串:
    f'{表達式}'
    """
    a = 10
    b = 20

'a=x, b=x'

message = f'a={a+10}, b={b}, c={b}'
print(message)

"""
5)數字格式化
:.Nf - 限制小數的小數點位數(N位)
:x>Nd - 數字占N位,不夠用x填充(填在左邊)
:x<Nd - 數字占N位,不夠用x填充(填在右邊)
:, - 用逗號將數據進行分隔(通用于銀行數據顯示)
:.N% - 以百分比的形式顯示數據,數據保留 N 位小數
"""
print('數字:{:.2f}'.format(3.1415926)) # 數字:3.14
print('數字:{1:.2f}'.format(3.1415926, 1.68926)) # 數字:1.69
print('數字:{n2:.2f}'.format(n1=3.1415926, n2=2.34233)) # 數字:2.34
pi = 3.1415926
print(f'數字:{pi:.2f}') # 數字:3.14

print('{:0>5d}'.format(34)) # 00034
print(f'{34:a>5d}') # aaa34
print(f'{34: >5d}') # 34

print(f'{34:a<5d}') # 34aaa

num = 19029300000
print(f'{num:,}') # 19,029,300,000

num = 0.45
print(f'{num:.2%}') # 45.00%

飛機移動、發射子彈、敵機自動出現、子彈打中敵機,敵機生命值減少 ....

左移1次 右移2次, 左移3次 右移3次

"""
沒有函數的問題:

  1. 明明是同樣的功能同樣的代碼需要多少次就要寫多少遍 (冗余、重復)
  2. 如果功能發生改變,所有使用過這個功能的位置都需要修改

解決辦法:使用函數
"""

def left():
print('==============左移==============')
print('看后視鏡')
print('向左打方向盤')
# print('踩油門')
print('回正方向盤')

def right():
print('==============右移==============')
print('看后視鏡')
print('向右打方向盤')
# print('踩油門')
print('回正方向盤')

left()
right()
right()
left()
left()
left()
right()
right()
right()

print('==============左移==============')

print('看后視鏡')

print('向左打方向盤')

# print('踩油門')

print('回正方向盤')

print('==============右移==============')

print('看后視鏡')

print('向右打方向盤')

# print('踩油門')

print('回正方向盤')

print('==============右移==============')

print('看后視鏡')

print('向右打方向盤')

# print('踩油門')

print('回正方向盤')

print('==============左移==============')

print('看后視鏡')

print('向左打方向盤')

# print('踩油門')

print('回正方向盤')

print('==============左移==============')

print('看后視鏡')

print('向左打方向盤')

# print('踩油門')

print('回正方向盤')

print('==============左移==============')

print('看后視鏡')

print('向左打方向盤')

# print('踩油門')

print('回正方向盤')

print('==============右移==============')

print('看后視鏡')

print('向右打方向盤')

# print('踩油門')

print('回正方向盤')

print('==============右移==============')

print('看后視鏡')

print('向右打方向盤')

# print('踩油門')

print('回正方向盤')

print('==============右移==============')

print('看后視鏡')

print('向右打方向盤')

# print('踩油門')

print('回正方向盤')

1.什么是函數

"""
1)概念(最重要!)
函數就是對實現某一特定功能的代碼段的封裝 (機器)

2)分類(誰定義的)
系統函數 - 系統已經定義了,程序可以直接使用的函數;比如:print、input、type、ord、chr、bin、len、id等等。(別人造好的機器)
自定義函數 - 程序員自己定義使用的函數。(自己造的機器)
"""

n = 10

sum1 = 1

for x in range(1, n+1):

sum1 *= x

print(sum1)

n = 20

sum1 = 1

for x in range(1, n+1):

sum1 *= x

print(sum1)

def jiecheng(n):
sum1 = 1
for x in range(1, n+1):
sum1 *= x
print(sum1)

jiecheng(10)

jiecheng(20)

jiecheng(5)

2.函數的定義(自己造機器)

"""
語法:
def 函數名(形參列表):
函數說明文檔
函數體

說明:
def - python定義函數的關鍵字;固定寫法
函數名 - 程序員自己命名:
標識符,不是關鍵字(要求);
所有的字母都小寫,多個單詞之間用下劃線隔開;
不能用系統提供的函數名、類名
見名知義(看到函數名大概知道函數的功能是什么)
(): - 固定寫法
形參列表 - 格式: 變量名1, 變量名2, 變量名3, ... (變量可以是沒有定義過的變量)
形參的作用是將函數外面的數據傳遞到函數里面
函數說明文檔 - 和def保持一個縮進的三個雙引號引起來的注釋 (說明書)
函數體 - 和def保持一個縮進的一條或者多條語句;實現函數功能的一條或者多條語句

(重要!)注意: 函數在定義的時候不會執行函數體
"""

初學者定義函數的步驟

"""
第一步:確定函數的功能
第二步:根據函數的功能確定函數名
第三步:確定函數的參數(看實現函數的功能需不需要額外的數據,需要幾個)
第四步:實現函數功能
(第五步: 確定函數返回值)
第六步:寫函數說明文檔
"""

需求: 定義一個函數實現求任意兩個數的和的功能

def yt_sum(num1, num2):
"""
求兩個數的和(功能說明部分)
:param num1: 第一個數
:param num2: 第二個數
:return: None(返回值說明)
"""
print(num1 + num2)

練習1:定義一個函數,打印指定字符串中大寫字母的個數

def upper_count(string):
"""
統計指定字符串中大寫字母的個數
:param string: 被統計的字符串
:return: None
"""
count = 0
for x in string:
if 'A' <= x <= 'Z':
count += 1
print(f'{string} 中大寫字母的個數:{count}')

def func1():
list1 = [1, 2, 3]
print(list1[100])
print('===============')

3. 函數的調用(使用機器)

"""
語法:
函數名(實參列表)

說明:
函數名 - 需要調用的函數的名字(函數名必須是已經定義過的函數的函數名)
() - 固定寫法
實參列表 - 格式: 數據1, 數據2, 數據3, ... (實參的個數和形參的個數保持一致)
作用:用來給形參賦值的。(真正傳遞到函數中使用的數據)

調用函數會執行函數的函數體
"""
yt_sum(20, 30)
yt_sum(7, 68)

upper_count('hkashAHf8aKsfdP')

func1()

1. 位置參數和關鍵字參數(實參分類)

"""
1)位置參數
實參直接寫(直接將多個數據用逗號隔開),讓實參和形參從位置上一一對應
"""

def func1(a, b, c):
print(f'a:{a}, b:{b}, c:{c}')

單獨使用位置參數傳參

func1(20, 30, 40)

"""

  1. 關鍵字參數
    以:形參名1=值1,形參名2=值2,.... 的形式傳參

注意: 要保證每個參數都有值
"""

單獨使用關鍵字參數傳參

func1(a=20, b=30, c=40)
func1(b=30, c=40, a=20)

"""
3)位置參數和關鍵字參數混合
要求: 位置參數必須在關鍵字參數的前面
"""
func1(10, c=30, b=20) # a:10, b:20, c:30
func1(10, 20, c=30) # a:10, b:20, c:30

func1(a=10, 20, 30) # SyntaxError: positional argument follows keyword argument

2.參數默認值(形參)

"""
定義函數的時候可以以: 形參名=值 的形式給參數賦默認值, 調用函數的時候有默認值的參數可以不用傳參

注意: 沒有默認值的參數必須放在有默認值參數的前面
"""

所有的參數都有默認值

def func2(x=10, y=20, z=30):
print(f'x:{x}, y:{y}, z:{z}')

func2() # x:10, y:20, z:30
func2(100) # x:100, y:20, z:30
func2(y=200) # x:10, y:200, z:30

def func3(y, x=10, z=30):
print(f'x:{x}, y:{y}, z:{z}')

3. 不定長參數(定義)

"""
定義參數的時候參數個數不確定就可以使用不定長參數

  1. 在形參前加 *
    帶一個*的形參,本質就是一個元組,對應的實參會作為這個元組的元素。
    這種不定長參數的函數只能用位置參數傳參

  2. 在形參前加 **
    帶兩個*的形參,本質就是一個字典,對應的實參會作為這個字典的值。
    這種不定長參數的函數只能用關鍵字參數傳參
    """

例子:定義一個函數可以求多個數的和

def yt_sum(*num):
sum1 = 0
for x in num:
sum1 += x
print(sum1)

yt_sum(1)
yt_sum(10, 20)
yt_sum(1, 2, 3, 4, 5)

def yt_sum2(**num):
print(num)

yt_sum2(a=10, b=20)

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。