最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

2022新版黑馬程序員python教程,8天python從入門到精通,學(xué)pyth

2022-11-18 15:46 作者:路過海面滑翔的風(fēng)  | 我要投稿

基礎(chǔ)語法

1.注釋

# 單行注釋

'''
多行注釋
'''

2.變量有沒有類型?

沒有,字符串變量表示變量存儲了字符串而不是表示變量就是字符串。

3.類型轉(zhuǎn)換

int(x) # x轉(zhuǎn)整數(shù)

float(x) # x轉(zhuǎn)浮點(diǎn)數(shù)

str(x) # x轉(zhuǎn)字符串

4.標(biāo)識符(python大小寫敏感

是用戶在編程的時候所使用的一系列名字,用于給變量、類、方法等命名。

關(guān)鍵字不能做標(biāo)識符:

False、True、None、and、as、assert、break、class、continue、def、del、elif、else、except、、finally、for、from、global、if、import、in、is、lambda、nonlocal、not、or、pass、raise、return、try、while、with、yield

5.運(yùn)算符

6.字符串

  • 定義
  • 字符串格式化1(str1)

精度控制語法是:m.n的形式控制,如%5d、 %5.2f、%.2f,其中m和.n均可省略

  • 字符串格式化2(如str2,注意那個f

這種方式:不理會類型、不做精度控制。適合對精度沒有要求的時候快速使用。

name = "張三"
age = 25
salary = 300000.0
str1 = "姓名:%s,年齡:%d,工資:%.2f" % (name, age, salary)
str2 = f"姓名:{name},年齡:{age},工資:{salary}"
print(str1 +'\n'+ str2)

結(jié)果

姓名:張三,年齡:25,工資:300000.00
姓名:張三,年齡:25,工資:300000.0

7.表達(dá)式

name = "張三"
age = 25
salary = 300000.0
aveSalary = salary/12
print(f"姓名:{name},年齡:{age},工資:{salary}")
print("%s的月工資:%.2f" % (name, aveSalary))

結(jié)果

姓名:張三,年齡:25,工資:300000.0

張三的月工資:25000.00

8.數(shù)據(jù)輸入輸出

input(),注意獲取的是字符串;print(),輸出。

name = input("name:")
age = input("age:")  # input獲取的是字符串
age = int(age)  # 類型轉(zhuǎn)換
salary = 300000.0
aveSalary = salary/12
print(f"姓名:{name},年齡:{age},工資:{salary}")
print("%s的月工資:%.2f" % (name, aveSalary))

結(jié)果

name:李四
age:28
姓名:李四,年齡:28,工資:300000.0
李四的月工資:25000.00

9.條件語句

if elif ... else

# 三次機(jī)會猜數(shù)字例子
import random
num = random.randint(1, 10)

for i in range(0, 3):
    inputNum = input("輸入你猜的數(shù)字:")
    inputNum = int(inputNum)
    if inputNum == num:
        print("恭喜你,猜對了!")
        exit()
    elif inputNum > num:
        print(f"{inputNum}大了")
    else:
        print(f"{inputNum}小了")
print("很遺憾,沒有機(jī)會了,答案是:", num)

10.循環(huán)語句

while循環(huán)語句,for循環(huán)語句。

兩者能完成的功能基本差不多,但仍有一些區(qū)別:

while循環(huán)的循環(huán)條件是自定義的,自行控制循環(huán)條件;

for循環(huán)是一種”輪詢”機(jī)制,是對一批內(nèi)容(嚴(yán)格說是序列類型的內(nèi)容:字符串、列表、元組等)進(jìn)行逐個處理,只能被動取出數(shù)據(jù)處理。

'''
輸出乘法表(while的例子)
'''

i = 1
while i <= 9:
    j = 1
    while j <= i:
        # \t:制表符;end=''的作用:輸出不換行
        print(f"{j}*{i}={j*i}\t", end='')
        j += 1
    print()  # 輸出一個換行
    i += 1

結(jié)果

1*1=1   
1*2=2  2*2=4  
1*3=3  2*3=6  3*3=9  
1*4=4  2*4=8  3*4=12 4*4=16 
1*5=5  2*5=10 3*5=15 4*5=20 5*5=25 
1*6=6  2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 
1*7=7  2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 
1*8=8  2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 
1*9=9  2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 

for的例子:數(shù)有幾個a

注意:for a in name 中 變量a 是循環(huán)中的臨時變量,作用域在循環(huán)內(nèi),如需訪問在循環(huán)外定義此變量

name = "zhangsan is a boy"
count = 0
for a in name:
    if a == 'a': 
        count += 1
print(f"有{count}個a")

結(jié)果:有3個a

continue 和 break

continue關(guān)鍵字:中斷本次循環(huán),直接進(jìn)入下一次循環(huán)

break:結(jié)束循環(huán)

11.函數(shù)

  • 定義
def 函數(shù)名(傳入?yún)?shù)):
    函數(shù)體
    return 返回值

# 注意:1. 先定義函數(shù),后調(diào)用函數(shù)。
       2. 參數(shù)不需要,可以省略;
          返回值不需要,可以省略。
  • 形參和實(shí)參
  • 返回值
  • None返回值
  1. None是類型'NoneType'的字面量,用于表示:空的、無意義的;
  2. 函數(shù)如何返回None:不使用return語句即返回None;主動return None
  3. 使用場景:函數(shù)返回值;if判斷相當(dāng)于False;變量定義
  • 函數(shù)說明文檔(多行注釋解釋函數(shù))
def count_a(name):
    """
    :param name:待測字符串
    :return: 字符串中a的個數(shù)
    """

    count = 0
    for a in name:
        if a == 'a':
            count += 1
    return count

str = "ZhangSan is a boy"
num = count_a(str)
print(f"有{num}個a")
  • 變量在函數(shù)的作用域
  • 函數(shù)進(jìn)階一(第七章)

函數(shù)有4中常見參數(shù)使用方式:(參數(shù)還可以是一個函數(shù))

1. 位置參數(shù):

根據(jù)參數(shù)位置來傳遞參數(shù)

2. 關(guān)鍵字參數(shù)

通過“鍵=值”形式傳遞參數(shù),可以不限參數(shù)順序。可以和位置參數(shù)混用,位置參數(shù)需在前。

3. 缺省參數(shù)

不傳遞參數(shù)值時會使用默認(rèn)的參數(shù)值

默認(rèn)值的參數(shù)必須定義在最后

4. 不定長參數(shù)(可變參數(shù))

位置不定長傳遞以*號標(biāo)記一個形式參數(shù),以元組的形式接受參數(shù),一般命名為args。

關(guān)鍵字不定長傳遞以**號標(biāo)記一個形式參數(shù),以字典的形式接受參數(shù),一般命名為kwargs。

"""
函數(shù)進(jìn)階之傳參
"""
def getBeauty(name, residence, age=14):
    print(f"{name}住在大觀園的{residence},今年{age}歲,亭亭玉立。")
# 1. 按照位置一一傳參
getBeauty('黛玉', '瀟湘館', 12)
# 2. 關(guān)鍵字參數(shù)
getBeauty(name='寶釵', age=13, residence='怡紅院')
# 3. 缺省參數(shù)(函數(shù)定義時,參數(shù)有默認(rèn)值,只能在最后)
getBeauty('探春', '秋爽齋')
# 4. 不定長參數(shù)

def test1(*args):
    print(args)

def test2(**kwargs):
    print(kwargs)

test1('黛玉', '瀟湘館', 12)
test2(name='寶釵', age=13, residence='怡紅院')

結(jié)果:

黛玉住在大觀園的瀟湘館,今年12歲,亭亭玉立。

寶釵住在大觀園的怡紅院,今年13歲,亭亭玉立。

探春住在大觀園的秋爽齋,今年14歲,亭亭玉立。

('黛玉', '瀟湘館', 12)

{'name': '寶釵', 'age': 13, 'residence': '怡紅院'}

  • 函數(shù)進(jìn)階二(第七章第四節(jié))---匿名函數(shù)

數(shù)據(jù)容器

1.概要

1.什么是數(shù)據(jù)容器?

一種可以存儲多個元素的Python數(shù)據(jù)類型

2. Python有哪些數(shù)據(jù)容器?

list(列表)、tuple(元組)、 str(字符串)、 set(集合)、 dict(字典)。

它們各有特點(diǎn),但都滿足可容納多個元素的特性。

2.list(列表)

1.定義

myList = ["賈寶玉", "林黛玉", "薛寶釵", 1, 2, 3]
print(myList)
myList[-1] = "王熙鳳"
print(myList[-1])
print(myList[2])
# 遍歷
# for name in myList:
#    print("姓名:", name)

結(jié)果

['賈寶玉', '林黛玉', '薛寶釵', 1, 2, 3]

王熙鳳

薛寶釵

2.一些操作

3.tuple(元組)

1.定義:

a_tuple = ("賈寶玉", "林黛玉", "薛寶釵", 1, 2)

print(a_tuple)

結(jié)果

('賈寶玉', '林黛玉', '薛寶釵', 1, 2)

2.元組的特點(diǎn):

  • 可以容納多個數(shù)據(jù);
  • 可以容納不同類型的數(shù)據(jù)( 混裝)
  • 數(shù)據(jù)是有序存儲的(下標(biāo)索引)
  • 允許重復(fù)數(shù)據(jù)存在
  • 不可以修改(增加或刪除元素等)
  • 支持for循環(huán)

多數(shù)特性和list一致,不同點(diǎn)在于不可修改的特性。

3.常用方法

?
第一階段-第六章-07-元組的定義和操作 P68 - 08:51
?

4.string(字符串)

1.作為數(shù)據(jù)容器,字符串有如下特點(diǎn):

  • 只可以存儲字符串
  • 長度任意(取決于內(nèi)存大小)
  • 支持下標(biāo)索引
  • 允許重復(fù)字符串存在
  • 不可以修改(增加或刪除元素等)
  • 支持for循環(huán)

2.常用方法

例子:strip()和split()演示

a = "??\n張三\n李四??\n"
b = a.strip()  # 刪除字符串頭尾的空格和換行,返回字符串,
# b:'張三\n李四', a還是a
c = a.split()  # 以空格和\n為分隔符,分割字符串,返回list
# c:['張三', '李四']

例子:分割字符串

my_str = "itheima itcast boxuegu"
numIT = my_str.count("it")  # 數(shù)字符串中"it"的數(shù)量
new_my_str = my_str.replace(" ", "|")  # 替換空格為|
str_list = new_my_str.split("|")  # 分割字符串

print(f"字符串{my_str}中有{numIT}個it字符")
print(f"字符串{my_str}中空格替換|后的新字符串:{new_my_str}")
print(f"新字符串{new_my_str}中按照|分割后的列表是:{str_list}")

"""
結(jié)果:
字符串itheima itcast boxuegu中有2個it字符
字符串itheima itcast boxuegu中空格替換|后的新字符串:itheima|itcast|boxuegu
新字符串itheima|itcast|boxuegu中按照|分割后的列表是:['itheima', 'itcast', 'boxuegu']
"""

5.序列

1.什么是序列?

內(nèi)容連續(xù)、有序,支持下標(biāo)索引的一類數(shù)據(jù)容器,(列表、元組、字符串)

2.序列如何做切片

heima = "你好好學(xué)習(xí),你天天向上,加油!"
new_heima = heima[12:2:-1] # '加,上向天天你,習(xí)學(xué)'

序列[起始:結(jié)束:步長]

  • 起始可以省略,省略從頭開始
  • 結(jié)束可以省略,省略到尾結(jié)束
  • 步長可以省略,省略步長為1 (可以為負(fù)數(shù),表示倒序執(zhí)行)
"""
序列切片,得到”上向天天“
"""

heima = "你好好學(xué)習(xí),你天天向上,加油!"
# 分割出 你天天向上
heima = heima.split(",")[1]  # 得到中間的字符串
# 倒序字符串
new_heima = heima[::-1]  # 倒敘切片:上向天天你
new_heima = new_heima.replace("你", "")  # 替換你為空:上向天天
print(new_heima)  # 輸出 上向天天

6.集合(set)

1.集合有如下特點(diǎn):

  • 可以容納多個數(shù)據(jù)
  • 可以容納不同類型的數(shù)據(jù)(混裝)
  • 數(shù)據(jù)是無序存儲的(不支持下標(biāo)索引)
  • 不允許重復(fù)數(shù)據(jù)存在
  • 可以修改(增加或刪除元素等)
  • 支持for循環(huán),不支持while

2.定義

"""
集合練習(xí):信息去重
"""

my_list = ["賈寶玉", "林黛玉", "王熙鳳", "賈寶玉", "林黛玉", "王熙鳳", "XiFeng", "DaiYu", "XiFeng", "DaiYu"]
my_set = set()
# my_set = {}  # 定義的是字典,不是集合
for beauty in my_list:
    my_set.add(beauty)
print(f"列表{my_list}存入集合后的結(jié)果{my_set}")

"""
結(jié)果
列表['賈寶玉', '林黛玉', '王熙鳳', '賈寶玉', '林黛玉', '王熙鳳', 'XiFeng', 'DaiYu', 'XiFeng', 'DaiYu']存入集合后的結(jié)果{'王熙鳳', 'DaiYu', '賈寶玉', 'XiFeng', '林黛玉'}
"""

3.常用操作

?
第一階段-第六章-12-集合的定義和操作 P73 - 22:34
?

7.字典(dict)

常用操作

例子

"""
字典例子:漲工資,升職
"""
daGuanYuan = {'賈寶玉': {'住處': '怡紅院', '月錢': 8000, '級別': 5},
              '林黛玉': {'住處': '瀟湘館', '月錢': 6000, '級別': 5},
              '薛寶釵': {'住處': '蘅蕪院', '月錢': 5000, '級別': 4},
              '襲人': {'住處': '怡紅院', '月錢': 900, '級別': 2},
              '晴雯': {'住處': '怡紅院', '月錢': 900, '級別': 2}}
for beauty in daGuanYuan:
    # 找出大丫頭們,給她們漲工資,升級
    if daGuanYuan[beauty]['級別'] == 2:
        daGuanYuan[beauty]['級別'] += 1
        daGuanYuan[beauty]['月錢'] += 1000

print(daGuanYuan)

8.總結(jié)

基于各類數(shù)據(jù)容器的特點(diǎn),它們的應(yīng)用場景如下:

  • 列表: 一批數(shù)據(jù),可修改、可重復(fù)的存儲場景
  • 元組: 一批數(shù)據(jù),不可修改、可重復(fù)的存儲場景
  • 字符串:一串字符串的存儲場景
  • 集合:一批數(shù)據(jù),去重存儲場景
  • 字典: 一批數(shù)據(jù),可用Key檢索Value的存儲場景

通用操作

python文件操作

1.文件的編碼

是一種規(guī)則集合,記錄了內(nèi)容與二進(jìn)制間互換的邏輯,常用的時UTF-8.

2.文件操作

  • 文件讀取

?
第一階段-第八章-02-文件的讀取操作 P86 - 26:22
?

"""
open(file,mode,encoding)例子:數(shù)文件中某字符串個數(shù)
"""

# coding=utf-8

f = open("紅樓夢.txt", 'r', encoding='UTF-8')

# hongLou = f.read()  # 讀取文件全部信息,返回字符串
# count1 = hongLou.count("怡紅院")
# print(f"方法一:文件《紅樓夢.txt》中有{count1}個怡紅院")

lines = f.readlines()  # 獲取文件全部內(nèi)容,返回list,每行是list的一個元素
count2 = 0
for line in lines:
    # print(line.strip())  # strip刪除字符串中頭尾的空格和換行
    names = line.split()  # 以空格和\n為分隔符,分割字符串,返回list
    for name in names:
        if name == "怡紅院":
            count2 += 1

print(f"方法二:文件《紅樓夢.txt》中有{count2}個怡紅院")

f.close()
  • 文件寫入和追加

1.寫入文件使用open函數(shù)的"w"模式;

追加寫入文件使用open函數(shù)的"a"模式。

2.寫入和追加的方法一樣,有:

  • write(), 寫入內(nèi)容
  • flush(), 刷新內(nèi)容到硬盤中

3.注意事項(xiàng):

  • w/a模式,文件不存在,會創(chuàng)建新文件;
  • w模式,文件存在,會清空原有內(nèi)容;a模式則會在原有內(nèi)容后追加寫入;
  • close()方法,帶有flush()方法的功能
f1 = open("紅樓夢1.txt", "w", encoding="UTF-8")  # utf8防亂碼
f1.write("石頭記")
f1.close()

f1 = open("紅樓夢1.txt", "a", encoding="UTF-8")
f1.write("\n木石前盟")
f1.close()

文件:紅樓夢1.txt

石頭記
木石前盟

備份文件的例子

fileName = "金陵十二釵.txt"
# 備份文件名
new_fileName = "金陵十二釵.txt.bak"
# 讀取文件
with open(fileName, 'r', encoding='utf-8') as f:
    jinChai = f.readlines()
out_file = open(new_fileName, 'w', encoding='utf-8')
# 寫入備份文件
for line in jinChai:
    # 又副冊的數(shù)據(jù)丟棄
    if line.split()[1] == "又副冊":
        break
    out_file.write(line)

out_file.close()

文件:金陵十二釵.txt

林黛玉 正冊
薛寶釵 正冊
賈元春 正冊
賈迎春 正冊
賈探春 正冊
賈惜春 正冊
賈巧姐 正冊
史湘云 正冊
妙玉 正冊
王熙鳳 正冊
李紈 正冊
秦可卿 正冊
香菱 副冊
薛寶琴 副冊
尤二姐 副冊
尤三姐 副冊
邢岫煙 副冊
李紋 副冊
李綺 副冊
夏金桂 副冊
秋桐 副冊
小紅 副冊
齡官 副冊
嬌杏 副冊
晴雯 又副冊
襲人 又副冊
平兒 又副冊
鴛鴦 又副冊
紫鵑 又副冊
鶯兒 又副冊
玉釧 又副冊
金釧 又副冊
彩云 又副冊
司棋 又副冊
芳官 又副冊
麝月 又副冊

文件:金陵十二釵.txt.bak

林黛玉 正冊
薛寶釵 正冊
賈元春 正冊
賈迎春 正冊
賈探春 正冊
賈惜春 正冊
賈巧姐 正冊
史湘云 正冊
妙玉 正冊
王熙鳳 正冊
李紈 正冊
秦可卿 正冊
香菱 副冊
薛寶琴 副冊
尤二姐 副冊
尤三姐 副冊
邢岫煙 副冊
李紋 副冊
李綺 副冊
夏金桂 副冊
秋桐 副冊
小紅 副冊
齡官 副冊
嬌杏 副冊

第九章--異常(bug)

1.異常及其捕獲方式

"""
異常捕獲
"""

file_name = "紅樓夢1.txt"
# 打開一個不存在的文件
# 1. 出現(xiàn)異常,執(zhí)行except中的語句,捕獲所有異常
try:
    f = open(file_name, 'r', encoding='utf-8')
except Exception as e:
    # 如果出現(xiàn)異常,則執(zhí)行以下語句,而不是停止程序
    print(e)
    f = open(file_name, 'w', encoding='utf-8')

# 2. 捕獲指定異常
try:
    1/0
except ZeroDivisionError as e:
    print("除數(shù)不能是0")
    print(e)


# 3. 捕獲指定多個異常
# else和finally可選
try:
    print(1/1)
except (ZeroDivisionError, NameError) as e:
    print("除數(shù)不能是0")
    print(e)
else:
    print("沒有異常執(zhí)行else語句內(nèi)容")
finally:
    print("有沒有異常都執(zhí)行finally的內(nèi)容")
    f.close()

異常捕獲2,---異常的傳遞性

"""
異常捕獲2,---異常的傳遞性
"""

def readTxt(file_name):
    f = open(file_name, 'r', encoding='utf-8')
    for name in f:
        print(name)

file_name = "紅樓夢1.txt"
# 打開一個不存在的文件
try:
    readTxt(file_name)
except Exception as e:
    # 如果出現(xiàn)異常,則執(zhí)行以下語句,而不是停止程序
    print(e)

2.python模塊

1.什么是模塊?

模塊就是一個Python代碼文件,內(nèi)含類、函數(shù)、變量等,我們可以導(dǎo)入進(jìn)行使用。

2.如何導(dǎo)入模塊

[from 模塊名] import [模塊|類|變量| 函數(shù)|*] [as 別名]

3.注意事項(xiàng):

  • from可以省略,直接import即可
  • as別名可以省略
  • 通過”.”來確定層級關(guān)系
  • 模塊的導(dǎo)入一般寫在代碼文件的開頭位置

4.自定義模塊

__all__變量可以控制import * 時哪些功能可以被導(dǎo)入
用法:__all__ = ['fun1','fun2']

例子:__main__

"""
自定義模塊 day4_bug.py
"""

def readTxt(file_name):
    f = open(file_name, 'r', encoding='utf-8')
    for name in f:
        print(name, end='')

# 沒有main,在調(diào)用時執(zhí)行了
file_name = "紅樓夢.txt"
readTxt(file_name)


# __main__保證在該模塊被引用的時候,不執(zhí)行main中的部分。
# pycharm快捷鍵:輸入 main 可直接跳出 if __name__ == '__main__':
if __name__ == '__main__':
    file_name = "紅樓夢1.txt"
    readTxt(file_name)

引用該模塊

"""
自定義模塊的調(diào)用
"""

from day4_bug import readTxt
readTxt("../day03/紅樓夢.txt")

運(yùn)行結(jié)果:調(diào)用了文件中沒有被__main__包圍的內(nèi)容,所以輸出了紅樓夢.txt的內(nèi)容

紅樓夢.txt文件的內(nèi)容如下:
王熙鳳
賈寶玉
賈璉
賈政
賈敏
../day03/紅樓夢.txt文件的內(nèi)容如下:
賈寶玉 住處 怡紅院 月錢 8000
林黛玉 住處 瀟湘館 月錢 6000
薛寶釵 住處 蘅蕪院 月錢 5000
襲人 住處 怡紅院 月錢 900
晴雯 住處 怡紅院 月錢 900

3.python包

例子

第10-12章--可視化圖

1.json數(shù)據(jù)格式

2.PyEcharts包

在線文檔:https://pyecharts.org/#/zh-cn/intro

例子

第二階段第一章--面向?qū)ο?/strong>

1.類的定義

2.面向?qū)ο缶幊?/strong>

面向?qū)ο缶幊叹褪?,使用對象進(jìn)行編程。

即,設(shè)計類,基于類創(chuàng)建對象,并使用對象來完成具體的工作。

3.一些內(nèi)置方法

4.私有成員、封裝

5.繼承--單繼承、多繼承

  • 復(fù)寫父類成員方法、屬性

6.類型注解

在代碼中寫數(shù)據(jù)的類型

方法的注解

Union類型的聯(lián)合類型注解

7.多態(tài)

例子數(shù)據(jù)分析案例

第二階段第二章--SQL

1.SQL基礎(chǔ)

1. SQL語言是什么?有什么作用?

SQL:結(jié)構(gòu)化查詢語言,用于操作數(shù)據(jù)庫,通用于絕大多數(shù)的數(shù)據(jù)庫軟件

2. SQL的特征:

  • 大小寫不敏感
  • 需以;號結(jié)尾
  • 支持單行、多行注釋
  • 單行注釋: -- 注釋內(nèi)容(--后面一定要有一個空格)
  • 單行注釋:# 注釋內(nèi)容(# 后面可以不加空格,推薦加上)
  • 多行注釋:/*?注釋內(nèi)容?*/

3. SQL語言的分類

  • 數(shù)據(jù)定義:DDL(Data Definition Language)庫的創(chuàng)建刪除、表的創(chuàng)建刪除等create、drop、show
  • 數(shù)據(jù)操縱:DML(Data Manipulation Language)新增、修改、刪除數(shù)據(jù)等
  • 數(shù)據(jù)控制:DCL(Data Control Language)新增、刪除用戶、密碼修改、權(quán)限管理等
  • 數(shù)據(jù)查詢:DQL(Data Query Language)基于需求查詢和計算數(shù)據(jù)

2.DDL--庫、表管理

第三階段:大數(shù)據(jù)相關(guān)技術(shù)pySpark

1.簡介

Spark是Apache基金會旗下的頂級開源項(xiàng)目,用于對海量數(shù)據(jù)進(jìn)行大規(guī)模分布式計算。大數(shù)據(jù)開發(fā)中的核心技術(shù)。

PySpark是Spark的Python實(shí)現(xiàn),是Spark為Python開發(fā)者提供的編程入口,用于以Python代碼完成Spark任務(wù)的開發(fā)。

PySpark不僅可以作為Python第三方庫使用,也可以將程序提交的Spark集群環(huán)境中,調(diào)度大規(guī)模集群進(jìn)行執(zhí)行。

2.安裝

在”CMD”命令提示符程序內(nèi),輸入:

pip install pyspark

或使用國內(nèi)代理鏡像網(wǎng)站(清華大學(xué)源)

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspark

3.PySpark的編程模型

PySpark的功能都是從SparkContext對象作為開始的。換句話說,SparkContext類對象,是PySpark編程中一切功能的入口。

獲取對象的方法:

# 1. 導(dǎo)包
from pyspark import SparkConf, SparkContext
# 2. 創(chuàng)建SparkConf對象
my_conf = SparkConf().setMaster('local[*]').setAppName('test_spark_app')
# 3. 基于SparkConf對象創(chuàng)建SparkContext對象
sc = SparkContext(conf=my_conf)
# 4. 打印PySpark的運(yùn)行版本
print(sc.version)
# 5. 停止PySpark程序
sc.stop()

PySpark的編程,主要分為如下三大步驟:

  • 數(shù)據(jù)輸入:通過SparkContext完成數(shù)據(jù)讀取
  • 數(shù)據(jù)計算:讀取到的數(shù)據(jù)轉(zhuǎn)換為RDD對象,調(diào)用RDD的成員方法完成計算
  • 數(shù)據(jù)輸出:調(diào)用RDD的數(shù)據(jù)輸出相關(guān)成員方法,將結(jié)果輸出到list、元組、字典、文本文件、數(shù)據(jù)庫等

4.PySpark的編程模型1--數(shù)據(jù)輸入

1. RDD對象是什么?為什么要使用它?

RDD對象稱之為分布式彈性數(shù)據(jù)集,是PySpark中數(shù)據(jù)計算的載體,它可以:

  • 提供數(shù)據(jù)存儲
  • 提供數(shù)據(jù)計算的各類方法,方法的返回值依舊是RDD
  • 所以可以實(shí)現(xiàn)RDD迭代計算

2. 如何輸入數(shù)據(jù)到Spark(即得到RDD對象)

支持兩種數(shù)據(jù)類型:python數(shù)據(jù)容器、讀取文件

  • 通過SparkContext的parallelize成員方法,將Python數(shù)據(jù)容器轉(zhuǎn)換為RDD對象
  • 通過SparkContext的textFile成員方法,讀取文本文件得到RDD對象
# 1. 導(dǎo)包
from pyspark import SparkConf, SparkContext
# 2. 創(chuàng)建SparkConf對象
my_conf = SparkConf().setMaster('local[*]').setAppName('test_spark_app')
# 3. 基于SparkConf對象創(chuàng)建SparkContext對象
sc = SparkContext(conf=my_conf)
# 4.1 Python數(shù)據(jù)容器(list、tuple、set、dict、str)轉(zhuǎn)RDD對象
rdd1 = sc.parallelize([1,2,3,4])
rdd2 = sc.parallelize((1,2,3,4))
rdd3 = sc.parallelize({1,2,4,5})
rdd4 = sc.parallelize("zhangsan")

print(rdd1.collect())
print(rdd2.collect())
print(rdd3.collect())
print(rdd4.collect())

'''
輸出結(jié)果
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 4, 5]
['z', 'h', 'a', 'n', 'g', 's', 'a', 'n']
'''
# 4.2 讀取文件轉(zhuǎn)RDD對象
rdd_file = sc.textFile('../day04/紅樓夢.txt')
print(rdd_file.collect())

'''
輸出結(jié)果:
['賈寶玉 住處 怡紅院 月錢 8000']
'''
# 5. 停止PySpark程序
sc.stop()

5.PySpark的編程模型2--數(shù)據(jù)計算

  1. map算子(成員方法):參數(shù)是一個函數(shù)(該函數(shù)可以用lambda寫),通過這個函數(shù)定義的規(guī)則逐個處理RDD中的元素,返回一個新的RDD。
  2. flatMap算子:參數(shù)也是一個函數(shù),功能:先對RDD執(zhí)行map操作,然后解除一層嵌套。
  3. reduceByKey算子:參數(shù)也是一個函數(shù)(func:(V,V)->V,該函數(shù)要求兩個類型相同的參數(shù),一個與傳入類型相同的返回值),功能:針對的是KV型RDD,自動按照key分組,然后根據(jù)func中的聚合邏輯,完成組內(nèi)數(shù)據(jù)的聚合操作,返回聚合后的RDD。
  4. filter算子:參數(shù)是一個函數(shù)(func:(T)->bool),功能:函數(shù)對RDD數(shù)據(jù)逐個處理,得到True的保留至返回值的RDD中。
  5. distinct算子:無參,功能:RDD去重
  6. sortBy算子:參數(shù)是一個函數(shù)(func:(T)->U,告知需要對那個數(shù)據(jù)進(jìn)行排序即可)ascending 參數(shù)(True升序,F(xiàn)alse降序), numPartitions參數(shù)(用多少分區(qū)排序),功能:按照func排序


# 注意會報錯找不到python解釋器路徑,下兩行給他指出python的路徑

import os

os.environ['PYSPARK_PYTHON'] = 'D:/12824/anaconda3/python.exe'

# 1. 導(dǎo)包
from pyspark import SparkConf, SparkContext
# 注意會報錯找不到python解釋器路徑,下兩行給他指出了python的路徑
import os
os.environ['PYSPARK_PYTHON'] = 'D:/12824/anaconda3/python.exe'


def map_func(data):
    return data * 10


# 2. 創(chuàng)建SparkConf對象
my_conf = SparkConf().setMaster('local[*]').setAppName('test_spark_app')
# 3. 基于SparkConf對象創(chuàng)建SparkContext對象
sc = SparkContext(conf=my_conf)
# 4.1 map算子(成員方法)
# 參數(shù)是一個函數(shù),通過這個函數(shù)定義的規(guī)則逐個處理RDD中的元素,返回一個新的RDD。
rdd1 = sc.parallelize([1, 2, 3, 4])
new_rdd1 = rdd1.map(map_func)
print(new_rdd1.collect())  # [10, 20, 30, 40]
# 4.2 flatMap算子, 比map多了個解除嵌套操作。
lst2 = [[1, 2], [4, 6], [6, 3]]
rdd2 = sc.parallelize(lst2)
print(rdd2.flatMap(lambda a: a*2).collect())  # [1, 2, 1, 2, 4, 6, 4, 6, 6, 3, 6, 3]
# reduceByKey算子:參數(shù)也是一個函數(shù)(func:(V,V)->V,該函數(shù)要求兩個類型相同的參數(shù),一個與傳入類型相同的返回值),功能:針對的是KV型RDD,自動按照key分組,然后根據(jù)func中的聚合邏輯,完成組內(nèi)數(shù)據(jù)的聚合操作,返回聚合后的RDD。
rdd3 = [('小明', 50), ('小明', 40), ('小明', 50), ('林黛玉', 100), ('林黛玉', 100), ('林黛玉', 100)]
rdd_reduceByKey = sc.parallelize(rdd3).reduceByKey(lambda a, b: a+b)
print(rdd_reduceByKey.collect())  # [('林黛玉', 300), ('小明', 140)]
# 4. filter算子:參數(shù)是一個函數(shù)(func:(T)->bool),功能:函數(shù)對RDD數(shù)據(jù)逐個處理,得到True的保留至返回值的RDD中。
rdd4 = sc.parallelize([1, 2, 3, 4, 5])
rdd_filter = rdd4.filter(lambda num: num % 2 == 0)
print(rdd_filter.collect())  # [2, 4]
# 5. distinct算子:無參,功能:RDD去重
rdd5 = sc.parallelize([1, 2, 1, 2, 5])
rdd_distinct = rdd5.distinct()
print(rdd_distinct.collect())  # [1, 2, 5]
# sortBy算子:參數(shù)是一個函數(shù)(func:(T)->U,告知需要對那個數(shù)據(jù)進(jìn)行排序即可)ascending 參數(shù)(True升序,F(xiàn)alse降序), numPartitions參數(shù)(用多少分區(qū)排序),功能:按照func排序
rdd6 = sc.parallelize([('小明', 50), ('小明', 40), ('小明', 50), ('林黛玉', 100), ('林黛玉', 100), ('林黛玉', 100)])
rdd_sortBy = rdd6.sortBy(lambda a: a[1], ascending=False, numPartitions=1)  # 按照a的第二列排序,降序,全局排序
print(rdd_sortBy.collect())  # [ ('林黛玉', 100), ('林黛玉', 100), ('林黛玉', 100), ('小明', 50), ('小明', 50), ('小明', 40)]
# 5. 停止PySpark程序
sc.stop()

綜合案例

"""
需求:復(fù)制以上內(nèi)容到文件中,使用Spark讀取文件進(jìn)行計算:
1. 各個城市銷售額排名,從大到小
2. 全部城市,有哪些商品類別在售賣
3. 北京市有哪些商品類別在售賣
"""
import json

from pyspark import SparkConf, SparkContext

my_conf = SparkConf().setMaster('local[*]').setAppName('my_second_app')
sc = SparkContext(conf=my_conf)

sellData = sc.textFile("銷售文件.txt")
# 數(shù)據(jù)處理,數(shù)據(jù)每行不是一個數(shù)據(jù)
sellData = sellData.flatMap(lambda s: s.split('|'))
# json數(shù)據(jù)轉(zhuǎn)字典
sellData = sellData.map(lambda s: json.loads(s))
# 1. 獲得各個城市銷售額排名
#  1.1. 取出城市和銷售額數(shù)據(jù)
sellData_city = sellData.map(lambda s: (s['areaName'], int(s['money'])))
#  1.2, 求和
sellData_city = sellData_city.reduceByKey(lambda a, b: a+b)
#  1.3. 排序
sellData_city = sellData_city.sortBy(lambda s: s[1], False, 1)
print(sellData_city.collect())

# 2. 全部城市,有哪些商品類別在售賣
all_category = sellData.map(lambda s: s['category']).distinct()
print(all_category.collect())
# 3. 北京市有哪些商品類別在售賣
#   3.2 篩選出北京的數(shù)據(jù),在取出類別,在去重
beijing_category = sellData.filter(lambda s: s[0] == "北京").map(lambda s: s['category']).distinct()
print(beijing_category.collect())

6.PySpark的編程模型3--數(shù)據(jù)輸出

  • 輸出為python對象
  • 輸出到文件(要下載hadoop包,配置它)
.......
rdd1 = sc.parallelize([1, 2, 3, 4])
new_rdd1 = rdd1.map(map_func)
print(new_rdd1.take(2), new_rdd1.count())  # [10, 20] 4
print(new_rdd1.collect())  # [10, 20, 30, 40]
......
rdd1 = sc.parallelize([1, 2, 3, 4], numSlices=1)
rdd1.saveAsTextFile("rdd.txt")




pycharm小技巧:

1、顯示方法參數(shù)
bar = Bar()  # 光標(biāo)在引用成員的括號處時,按alt+p顯示方法的參數(shù)
2、多行一起編輯
self.date = date
self.order_id = order_id
self.money = money
self.province = province
# 按住alt點(diǎn)每一行,可以一起輸入self.
3、shift+alt+上\下 : 向上\下移動當(dāng)前代碼行



2022新版黑馬程序員python教程,8天python從入門到精通,學(xué)pyth的評論 (共 條)

分享到微博請遵守國家法律
普安县| 义乌市| 大庆市| 资兴市| 科技| 河池市| 行唐县| 常宁市| 闽清县| 保德县| 张北县| 南汇区| 乌鲁木齐市| 岱山县| 北安市| 泸定县| 铁力市| 体育| 顺平县| 通江县| 大同市| 类乌齐县| 永州市| 独山县| 黄梅县| 介休市| 柳州市| 沁源县| 慈溪市| 大埔区| 遵义市| 浪卡子县| 那坡县| 靖西县| 绩溪县| 合川市| 西华县| 普格县| 准格尔旗| 花莲市| 美姑县|