比亞迪與英國ADL聯手打造歐洲最大電動公車隊

7{icon} {views}

比亞迪於倫敦時間7月29日上午宣佈將同亞歷山大•鄧尼斯有限公司(ADL)合作,將投資1900萬英鎊(約合人民幣1.8億元)共同打造由51輛單層電動公車組成的車隊,規模為全歐最大。

根據雙方合作框架協定,這個由51台零排放單層電動公車組成的車隊將採12公尺大巴車型,車體配有比亞迪的底盤和動力系統、車身由ADL生產,造型融合熱銷車型Enviro200的設計。這將是歐洲最大規模的全尺寸電動公車隊。比亞迪也將負責車隊的現場維修和保養服務。

倫敦交通局(TfL)在本月初宣佈,作為2020年前實現倫敦市所有單層公車的零排放目標的一部分,將會率先實現倫敦市中心連接滑鐵盧和維多利亞的兩條公交路線(507路和521路)電動化。負責統一售後服務倫敦公交運營商Go-Ahead確認,將把507和521公交路線上引進51台零排放的純電動大巴。Go-Ahead表示,希望這個革命性的車隊在2016年8月27日前全部投入運營。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

江湖在走大七要有,BMW 總裁:純電版 7 系列將會是最強電動轎車

8{icon} {views}

大七的威武已經無需多言,最近 BMW 董事會主席齊普斯更宣布,新一代的 7 系列將會有多種動力型態,而最強大的一款就是純電版本,性能超越現在的 M760Li xDrive,不管報恩報仇都更加爽快。

BMW 集團前天舉行了年度記者會,宣示了未來的減碳目標與投資計畫外,也揭露了新一代的頂級產品線 7 系列將會加入更多電動化布局。董事會主席齊普斯(Oliver Zipse)表示,新一代的 7 系列將會有汽油、柴油、油電以及純電 4 種動力選擇,而性能最強的版本將會是純電動車。

「這將是純電池動力車型首次搭載第五代電力驅動元件,提供前所未見的強大動能」,齊普斯指出,BMW 集團在布局電動化的同時,也希望提供所有車主不同能源選項,讓全球駕駛人可以根據自己的需求去判斷,而不是被迫改變。

要拿下最強電動轎車之名,代表新的純電大七要超越現在的王者 M760Li xDrive,以及它 6.6 升雙渦輪 V12 引擎的 601 馬力和 800 牛頓米扭力;同時也可能超越現在 BMW 馬力之王 M5 的 617 匹,才能稱為真正的最強名號。

提到最強,就不能忘記 Tesla Model S,以目前市售的 Performance 版本來看,Model S 的馬力是 613,扭力為 931 牛頓米,電動大七很有機會跟它一較高下。

BMW 的純電動車產品線在 2023 年將會超過 12 款,包括即將在明年上市的 i4 和 ix3,他們也預期 2021 年的電動車需求將會比 2019 年翻倍,到 2025 年,BMW 的電動車銷量將會成長 30% 以上。而支持他們持續投入的動力,就是 2019 年車市低迷中仍然創造正面盈餘的獲利能力。

2019 年 BMW 在車輛銷售部分的營收成長了 6.8%,來到 916 億歐元,並且讓他們在全球銷量疲軟的車市中,依然能夠創造 25 億歐元的現金流,無論是面對疫情衝擊或是持續進行中的電池戰爭,BMW 手上的現金都讓他們保有優勢競爭力。

(合作媒體:。首圖來源:)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

特斯拉不顧郡衛生局反對,佛利蒙廠仍於週一復工

6{icon} {views}

隨著加州放寬居家避疫令,電動車大廠特斯拉(Tesla)原計劃在上週五(8日)讓加州佛利蒙(Fremont)廠復產,但遭該廠所在的阿拉米達郡(Alameda County)以不符防疫標準為由禁止。特斯拉執行長馬斯克(Elon Musk)對此大感不滿,決定不顧禁令,仍於11 日復工,更直嗆「要逮捕就逮捕我一人」。

CNBC、MarketWatch 等外媒報導,特斯拉週一發送電子郵件給員工,標題為「無薪假已結束,我們將重新投入生產!」(Furlough Has Ended And We Are Back To Work in Production!),當中寫道:「我們很高興能重新開始運作,並實施非常詳細的計畫,以確保您返回工作崗位時的安全。」

同時,馬斯克也在個人推特上發文稱:「特斯拉今天違反阿拉米達郡的規定重啟生產,我將與所有人站在同一線。如果有人要被逮捕,我要求只能逮捕我一人。」

阿拉米達郡衛生局週一表示,該局已獲悉,特斯拉違反居家避疫令期間允許的「最低限度營運」,並已通知該公司必須取得郡政府核准,才能進行復工。衛生局官員稱,預計將在週一稍晚收到特斯拉提出的提案,期盼特斯拉能遵守相關規定,而無需採取進一步的執法措施。

美國財政部長梅努欽(Steven Mnuchin)週一呼籲,加州政府應盡一切必要的努力,協助特斯拉重新開放唯一位於美國本土的製造廠,將特斯拉留在加州。

7 日,加州州長紐森(Gavin Newsom)宣佈實施第二階段重啟,允許低感染風險的行業恢復營業,包括部分零售業和製造業。雖然特斯拉已擬定防疫措施,但復工計畫仍遭到阿拉米達郡衛生局拒絕。

阿拉米達郡衛生局強調,雖然州政府放寬防疫禁令,但法律上來說,如果地方政府有相關命令,應以較嚴格者為準。9 日,馬斯克不滿地在推特上表示,將把總部和部分生產遷移到德州或內華達州,並指控阿拉米達郡的作法違憲,將會提告。

數小時後,特斯拉正式向舊金山聯邦法院提起訴訟,指該郡違反多項聯邦和州憲法,並無視州長的命令。

報導指出,在馬斯克揚言要離開加州後,包括德州、喬治亞州、猶他州、俄克拉荷馬州和內華達州官員都透過推特向馬斯克喊話,歡迎他將總部和工廠搬遷到當地。

券商 Wedbush 分析師 Dan Ives 預估,特斯拉若真的要遷移工廠,將是極為浩大的工程,可能需要耗時 12 到 18 個月。

(本文內容由 授權使用。首圖來源: CC BY 2.0)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

三陽電動機車預估年底上市,將採雙電池系統可充電也可換電

9{icon} {views}

台灣機車龍頭三陽機車,原先預計要在今年中發表的新款電動機車,最新消息指出將會延後到今年底,而動力系統將會採用雙通道,可以充電,也可以換電。不過,從目前的數據來看,這輛車的動力性能恐怕不會太高。

三陽機車對於新產品,抱持著不搶快也不落後的策略,儘管目前仍未推出能夠與主流市場競爭的電動車款,但是布局電池技術已經兩年之久,最主要的考量就是成本因素。

三陽布局雙電池技術已有兩年之久,分別是與中油合作電池以及自家研發的鋁電池,未來三陽的電動機車將能夠支援充電以及換電兩種能源系統,而不會被 Gogoro 電網綁住。

三陽董事長吳清源在之前曾表示,電動車問題是電池成本太高,一輛車的電池成本可能要台幣 4 萬元,三陽不想跳進來做賠錢生意。「所有資訊都被其他廠商掌握,我也無法接受」,因此吳清源選擇投資新技術,成本相對低的鋁電池。

鋁電池耐高溫,製程污染較低且壽命較長,可取代現有的鉛酸電池。且鋁電池成本已較鋰電池低,具有優異的充、放電特性,僅 5 分鐘就可以充滿 80% 以上的電力,具有相當優勢。不過目前鋁電池的動力性能還是不如鋰電池,因此主要會用字平價的都會代步車款上。

另一套系統則是中油的共用電池,採用軟碳鋰電池(soft carbon),三陽著眼點在於中油具有國產電池能量,同時還有全台通路優勢,這個合作能帶給三陽的好處極大,又因為中油有政府當靠山,又沒有同業競爭問題,三陽才能放心合作。

三陽目前其實也不是沒有電動車,但現在銷售的 eWoo 比較像是電動自行車裝上機車殼。而去年發表的商用版電動機車 e X’Pro ,則不見後續消息。

三陽去年在米蘭車展發表商用電動車 e X’Pro,不過至今尚未開賣。

三陽主打穩進策略,甚至連電池系統都同時推兩套,目的就是要避免押錯寶而產生大幅虧損,然而換另一個角度說,這樣的策略也注定他難以奪下冠軍寶座。或許在電動車這個還看不到利潤的領域,不賠就是贏,即使不能領先,至少也不要喪失存在感。

(合作媒體:。圖片來源:三陽)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

Tesla Model 3 再點電動車市場戰火,比亞迪、格力紛出新招

8{icon} {views}

美商特斯拉(Tesla)發表價格僅3.5萬美金起跳的平民款電動車Tesla Model 3 ,短時間內立即湧入全球超過30萬筆訂單,同時也重新點燃電動車界的戰火。比亞迪於4月10發表新款電動車,中國家電廠格力也發表宣言,將砸重金投入新能源車市場。

特斯拉訂單火爆,領導電動車市場脈動

特斯拉一直是電動車界最受矚目的公司。Model 3於三月31日發表後短短兩周,就已收到來自全32.5萬輛的訂單。EnergyTrend分析師呂理舜指出,特斯拉的電池管理與馬達系統有其技術優勢,加上沒有傳統車廠的包袱,未來兩年內預計仍將主宰全球電動車市場。

特斯拉目前所有車輛都由公司自行組裝生產。因應Model 3的龐大需求,特斯拉亦可能會擴大生產基地,其中一個市場傳聞不斷的設廠地點就在中國。三月中就有傳聞指出,中國蘇州相關政府部門曾就特斯拉設廠一事進行討論,但特斯拉對此並無正面回應。

《鉅亨網》指出,特斯拉的營運模式是產銷一體,但在中國必須產銷分離;若要在中國建立生產基地,則需解決此一問題。

此外,台灣特斯拉公司已經正式登記成軍,初期業務內容以銷售、維護為主。特斯拉也有不少車輛零組件來自台灣,包含減速齒輪箱、汽車電池管理系統線組、直流轉換器等。

比亞迪不甘示弱,新車百公里加速僅需4.9

就在Tesla Model 3推出的10天候,中國電動車商比亞迪(BYD)也推出小型油電SUV車「元」,加速到100公里只需要4.9秒,與特斯拉較勁的意味濃厚。

SUV「元」於去年四月在上海車展發表,歷經11個月後正式在北京問世,售價59,900元人民幣起。SUV「元」是目前首款百公里加速在5秒以內的中小型SUV車,搭載1.5L發動機與雙電機動力組合,在混和模式下的百公里油耗僅1.3公升。

此外,「元」也提供360度影像、無鑰匙啟動、車道偏離預警、ESP車身穩定系統、胎壓監測、預緊式安全帶、8安全氣囊以及行車記錄儀等安全配置。

雖然中國近期放緩對新能源車的補貼,比亞迪對於2016年的新能源汽車銷量樂觀,預計可達12~15萬輛,其中包含深圳7,700輛、太原8,200輛、廣州3,000輛電動巴士,以及北京20,000輛混和巴士、上海30,000輛電動車的需求。

中國新能源車市熱絡,格力宣布加入搶灘

看好新能源車市場發展,中國大陸家電廠商格力公司董事長董明珠日前宣布將展開產業轉型,一方面將開始販售智慧型手機,還將砸下重金買下珠海銀隆新能源公司,目標是要進軍新能源車市場。

中國媒體報導,珠海銀隆準備辦理增資,增資額預估將達人民幣50億元;格力若要入主珠海銀隆,可能需要上百億元人民幣的資金。無論格力將如何展開其新能源車市場戰略,都可看出新能源車在中國已成為一大重點產業。

(照片來源:)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

全球速度最快電動汽車 時速達644km

3{icon} {views}

據報導,最近摩納哥跑車廠商Venturi開發出了全球速度最快的電動汽車。

這輛名為Venturi Buckeye Bullet 3(VBB3)的電動汽車,由Venturi的Formula E電動方程式團隊和俄亥俄州立大學的汽車研究中心聯合打造而成。該車之前的模型曾在2010年創造了全球電動汽車陸上行駛速度記錄:307英里每小時(mph)。但當前模型的預估速度為372mph,將輕鬆打破這一記錄。Venturi的目標是令VBB3的速度最終達到400mph(約合644km/hr)。

不過高速電動汽車也有一些自己的優勢。和其他電動車一樣,VBB3產生的熱量遠比同等功率的汽油引擎更少,因此VBB3無需冷卻通風口。不過這並不意味著該車“很冷”,實際上,其內部系統包含許多石油潤滑機制和一隻每次行駛前都要加滿冰的箱子。

去年,由於開採和氣候變化等因素造成美國邦納維爾鹽鹼灘退化,Venturi無法對VBB3進行測試,他們希望今年夏天時情況會好一些,這樣他們就能繼續其追求速度的征程。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

戴姆勒、特斯拉聯合開發電動版奔馳B級開始投產

3{icon} {views}

電動版奔馳B級是戴姆勒繼Smart ForTwo電動版之後的第二款純電動車,由戴姆勒和特斯拉聯合開發,其電動馬達由特斯拉提供,今年將先後在美國和歐洲上市。

電動版奔馳B級擁有大約200公里的續航里程,0到100km/h加速僅需時7.9秒,最高速度為160km/h。其電動馬達由特斯拉提供,規律達174馬力,同寶馬i3電動車的規律相比還高出8馬力。目前戴姆勒尚未公佈新款奔馳B級電動車的售價。

電動版奔馳B級由戴姆勒位於德國的拉施塔特(Rastatt)工廠負責生產,汽油、柴油及天然氣版本的奔馳B級也在該工廠投產。據戴姆勒一名女發言人透露,電動版奔馳B級在其整個生命週期中的產量預計將達到五位數。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

Python語言基礎05-函數和模塊的使用

3{icon} {views}

本文收錄在

在分享本章節的內容之前,先來研究一道數學題,請說出下面的方程有多少組正整數解。

事實上,上面的問題等同於將8個蘋果分成四組每組至少一個蘋果有多少種方案。想到這一點問題的答案就呼之欲出了。

可以用Python的程序來計算出這個值,代碼如下所示。

"""
輸入M和N計算C(M,N)

Version: 0.1
Author: along
"""
m = int(input('m = '))
n = int(input('n = '))
fm = 1
for num in range(1, m + 1):
    fm *= num
fn = 1
for num in range(1, n + 1):
    fn *= num
fmn = 1
for num in range(1, m - n + 1):
    fmn *= num
print(fm // fn // fmn)

輕鬆得出答案為:35

 

1. 函數的作用

  不知道大家是否注意到,在上面的代碼中,我們做了3次求階乘,這樣的代碼實際上就是重複代碼。編程大師Martin Fowler先生曾經說過:“代碼有很多種壞味道,重複是最壞的一種!”,要寫出高質量的代碼首先要解決的就是重複代碼的問題。對於上面的代碼來說,我們可以將計算階乘的功能封裝到一個稱之為“函數”的功能模塊中,在需要計算階乘的地方,我們只需要“調用”這個“函數”就可以了。

1.1 定義函數

  在Python中可以使用def關鍵字來定義函數,和變量一樣每個函數也有一個響亮的名字,而且命名規則跟變量的命名規則是一致的。在函數名後面的圓括號中可以放置傳遞給函數的參數,這一點和數學上的函數非常相似,程序中函數的參數就相當於是數學上說的函數的自變量,而函數執行完成后我們可以通過return關鍵字來返回一個值,這相當於數學上說的函數的因變量。

在了解了如何定義函數后,我們可以對上面的代碼進行重構,所謂重構就是在不影響代碼執行結果的前提下對代碼的結構進行調整,重構之後的代碼如下所示。

def factorial(num):
    """求階乘"""
    result = 1
    for i in range(1, num + 1):
        result *= i
    return result

m = int(input('m = '))
n = int(input('n = '))
# 當需要計算階乘的時候不用再寫循環求階乘而是直接調用已經定義好的函數
print(factorial(m) // factorial(n) // factorial(m - n))

  說明: Python的math模塊中其實已經有一個factorial函數了,事實上要計算階乘可以直接使用這個現成的函數而不用自己定義。下面例子中的一些函數在Python中也都是現成的,我們這裡是為了講解函數的定義和使用才把它們又實現了一遍,實際開發中不建議做這種低級的重複性的工作。

 

2. 函數的參數

  函數是絕大多數編程語言中都支持的一個代碼的”構建塊”,但是Python中的函數與其他語言中的函數還是有很多不太相同的地方,其中一個顯著的區別就是Python對函數參數的處理。在Python中,函數的參數可以有默認值,也支持使用可變參數,所以Python並不需要像其他語言一樣支持,因為我們在定義一個函數的時候可以讓它有多種不同的使用方式,下面是兩個小例子。

from random import randint

def roll_dice(n=2):
    """搖色子"""
    total = 0
    for _ in range(n):
        #print(_)
        total += randint(1, 6)
        #print(total)
    return total

def add(a=0, b=0, c=0):
    """三個數相加"""
    return a + b + c


# 如果沒有指定參數那麼使用默認值搖兩顆色子
print(roll_dice())
# 搖三顆色子
print(roll_dice(3))
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
# 傳遞參數時可以不按照設定的順序進行傳遞
print(add(c=50, a=100, b=200))

  我們給上面兩個函數的參數都設定了默認值,這也就意味着如果在調用函數的時候如果沒有傳入對應參數的值時將使用該參數的默認值,所以在上面的代碼中我們可以用各種不同的方式去調用add函數,這跟其他很多語言中函數重載的效果是一致的。

 

2.1 函數的可變參數

  其實上面的add函數還有更好的實現方案,因為我們可能會對0個或多個參數進行加法運算,而具體有多少個參數是由調用者來決定,我們作為函數的設計者對這一點是一無所知的,因此在不確定參數個數的時候,我們可以使用可變參數,代碼如下所示。

# 在參數名前面的*表示args是一個可變參數
def add(*args):
    result = 0
    for num in args:
        result += num
    return(result)

# 在調用add函數時可以傳入0個或多個參數
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 3, 5, 7, 9))

 

3. 用模塊管理函數

  對於任何一種編程語言來說,給變量、函數這樣的標識符起名字都是一個讓人頭疼的問題,因為我們會遇到命名衝突這種尷尬的情況。最簡單的場景就是在同一個.py文件中定義了兩個同名函數,由於Python沒有函數重載的概念,那麼後面的定義會覆蓋之前的定義,也就意味着兩個函數同名函數實際上只有一個是存在的。

def foo():
    print('hello, world!')

def foo():
    print('goodbye, world!')

# 下面的代碼會輸出什麼呢?
foo()

   當然上面的這種情況我們很容易就能避免,但是如果項目是由多人協作進行團隊開發的時候,團隊中可能有多個程序員都定義了名為foo的函數,那麼怎麼解決這種命名衝突呢?答案其實很簡單,Python中每個文件就代表了一個模塊(module),我們在不同的模塊中可以有同名的函數,在使用函數的時候我們通過import關鍵字導入指定的模塊就可以區分到底要使用的是哪個模塊中的foo函數,代碼如下所示。

(1)先在同級目錄下,創建2個py文件

module1.py

def foo():
    print('hello world')

module2.py

def foo():
    print('goodbye world')

 

(2)直接使用模塊使用函數

test.py

from module1 import foo
foo()

from module2 import foo
foo()

 

(3)也可以按照如下所示的方式來區分到底要使用哪一個foo函數。

test.py

import module1 as m1
import module2 as m2

m1.foo()
m2.foo()

 

(4)但是如果將代碼寫成了下面的樣子,那麼程序中調用的是最後導入的那個foo,因為後導入的foo覆蓋了之前導入的foo。

test.py

from module1 import foo
from module2 import foo

foo()

from module2 import foo
from module1 import foo

# 輸出hello, world!
foo()

  需要說明的是,如果我們導入的模塊除了定義函數之外還中有可以執行代碼,那麼Python解釋器在導入這個模塊時就會執行這些代碼,事實上我們可能並不希望如此,因此如果我們在模塊中編寫了執行代碼,最好是將這些執行代碼放入如下所示的條件中,這樣的話除非直接運行該模塊,if條件下的這些代碼是不會執行的,因為只有直接執行的模塊的名字才是”__main__”。

module3.py

def foo():
    pass

def bar():
    pass

# __name__是Python中一個隱含的變量它代表了模塊的名字
# 只有被Python解釋器直接執行的模塊的名字才是__main__
if __name__ == '__main__':
    print('call foo()')
    foo()
    print('call bar()')
    bar()

test.py

import module3
# 導入module3時 不會執行模塊中if條件成立時的代碼 因為模塊的名字是module3而不是__main__

 

4. 練習

練習1

實現計算求最大公約數和最小公倍數的函數。

參考答案:

def gcd(x, y):
    """求最大公約數"""
    #(x, y) = (y, x) if x > y else (x, y)
    if x > y:
        (x, y) = (y, x)
    else:
        (x, y)
    for factor in range(x, 0, -1):
        if x % factor == 0 and y % factor == 0:
            return factor

def lcm(x, y):
    """求最小公倍數"""
    return x * y // gcd(x, y)

print(gcd(9,12))
print(lcm(9,12))

 

練習2

實現判斷一個數是不是迴文數的函數。

參考答案:

def is_palindrome(num):
    """
    判斷一個數是不是迴文數
    迴文數是指將一個正整數從左往右排列和從右往左排列值一樣的數
    """
    temp = num
    total = 0
    while temp > 0:
        total = total * 10 + temp % 10
        temp //= 10
    return total == num

 

練習3

實現判斷一個數是不是素數的函數。

參考答案:

def is_prime(num):
    """判斷一個數是不是素數"""
    for factor in range(2, num):
        if num % factor == 0:
            return False
    return True if num != 1 else False

print(is_prime(1))

 

練習4

寫一個程序判斷輸入的正整數是不是迴文素數。

參考答案:

if __name__ == '__main__':
    num = int(input('請輸入正整數: '))
    if is_palindrome(num) and is_prime(num):
        print('%d是迴文素數' % num)
    else:
        print('%d不是迴文素數' % num)

 

  注意:通過上面的程序可以看出,當我們將代碼中重複出現的和相對獨立的功能抽取成函數后,我們可以組合使用這些函數來解決更為複雜的問題,這也是我們為什麼要定義和使用函數的一個非常重要的原因。

 

5. 變量作用域

(1)最後,我們來討論一下Python中有關變量作用域的問題

def foo():
    b = 'hello'

    # Python中可以在函數內部再定義函數
    def bar():
        c = True
        print(a)
        print(b)
        print(c)

    bar()
    # print(c)  # NameError: name 'c' is not defined


if __name__ == '__main__':
    a = 100
    # print(b)  # NameError: name 'b' is not defined
    foo()

  上面的代碼能夠順利的執行並且打印出100、hello和True,但我們注意到了,在bar函數的內部並沒有定義a和b兩個變量,那麼a和b是從哪裡來的。

  我們在上面代碼的if分支中定義了一個變量a,這是一個全局變量(global variable),屬於全局作用域,因為它沒有定義在任何一個函數中。在上面的foo函數中我們定義了變量b,這是一個定義在函數中的局部變量(local variable),屬於局部作用域,在foo函數的外部並不能訪問到它;但對於foo函數內部的bar函數來說,變量b屬於嵌套作用域,在bar函數中我們是可以訪問到它的。bar函數中的變量c屬於局部作用域,在bar函數之外是無法訪問的。事實上,Python查找一個變量時會按照“局部作用域”、“嵌套作用域”、“全局作用域”和“內置作用域”的順序進行搜索(由小到大),前三者我們在上面的代碼中已經看到了,所謂的“內置作用域”就是Python內置的那些標識符,我們之前用過的input、print、int等都屬於內置作用域。

  其中,在foo函數中調用bar函數的變量c,會報錯;因為讀不到此變量。

 

(2)再看看下面這段代碼,我們希望通過函數調用修改全局變量a的值,但實際上下面的代碼是做不到的。

def foo():
    a = 200
    print(a)  # 200

if __name__ == '__main__':
    a = 100
    foo()
    print(a)  # 100

   在調用foo函數后,我們發現a的值仍然是100,這是因為當我們在函數foo中寫a = 200的時候,是重新定義了一個名字為a的局部變量,它跟全局作用域的a並不是同一個變量,因為局部作用域中有了自己的變量a,因此foo函數不再搜索全局作用域中的a。

 

(3)如果我們希望在foo函數中修改全局作用域中的a,代碼如下所示。

def foo():
    global a
    a = 200
    print(a)  # 200

if __name__ == '__main__':
    a = 100
    foo()
    print(a)  # 200

  我們可以使用global關鍵字來指示foo函數中的變量a來自於全局作用域,如果全局作用域中沒有a,那麼下面一行的代碼就會定義變量a並將其置於全局作用域。

  同理,如果我們希望函數內部的函數能夠修改嵌套作用域中的變量,可以使用nonlocal關鍵字來指示變量來自於嵌套作用域,請大家自行試驗。

  在實際開發中,我們應該盡量減少對全局變量的使用,因為全局變量的作用域和影響過於廣泛,可能會發生意料之外的修改和使用,除此之外全局變量比局部變量擁有更長的生命周期,可能導致對象佔用的內存長時間無法被垃圾回收。事實上,減少對全局變量的使用,也是降低代碼之間耦合度的一個重要舉措,同時也是對的踐行。減少全局變量的使用就意味着我們應該盡量讓變量的作用域在函數的內部,但是如果我們希望將一個局部變量的生命周期延長,使其在定義它的函數調用結束后依然可以使用它的值,這時候就需要使用,這個我們在後續的內容中進行講解。

  說明: 很多人經常會將“閉包”和混為一談,但實際上它們並不是一回事,如果想了解這個概念,可以看看的解釋。

說了那麼多,其實結論很簡單,從現在開始我們可以將Python代碼按照下面的格式進行書寫,這一點點的改進其實就是在我們理解了函數和作用域的基礎上跨出的巨大的一步。

def main():
    # Todo: Add your code here
    pass

if __name__ == '__main__':
    main()

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

李嘉誠投資電動車 F-立凱受惠

9{icon} {views}

香港首富李嘉誠所投資的香港五龍電動車日前與台灣F-立凱簽署交易契約,共同打造垂直整合的電動車廠。五龍電動車由李嘉誠所投資,未來將斥資新台幣20億元增資F-立凱,取得21.8%股權。

根據立凱、五龍電動車與五龍動力的協議,三方將以策略聯盟、資本合作的方式取得股權交換方案,五龍電動車與五龍動力將對立凱電共同投資新台幣20億元左右,取得F-立凱的21.8%股權。

F-立凱先前已獲潤泰集團總裁尹衍樑旗下相關企業投資持股逾12%,以生產電動車關鍵零組件磷酸鋰鐵正極材料為主要業務。

李嘉誠看好電動車關鍵零組件,從2010年起陸續購入五龍電動車股權,目前持股比例約為6.6%。本次五龍電動車將與F-立凱合作,等於李嘉誠加入台灣電動車業者投資行列。

同時,F-立凱將以每股港幣0.5元的價格認購五龍電動車集團所發行的430萬普通股與2.75億元港幣的無擔保可轉換公司債,總投資額預計將達港幣4.9億元,持股比率為4.2%。

整體交易完成後,李嘉誠在五龍電動車的時股比重將從6.6%降至6.3%。同時,五龍與F-立凱將著手打造全球化的一條龍供應鏈,並結合南韓SK集團技術與美國Smith物流車市場,於兩岸三地、國際市場形成明確分工。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

Appium+python自動化(三十九)-Appium自動化測試框架綜合實踐 – 代碼實現(超詳解)

4{icon} {views}

簡介

  前邊一直在分享testng的相關文章,看了點贊量和閱讀數不是很高,宏哥猜測估計是大家確實是用不到或者不喜歡吧!不過宏哥經過一段時間的準備,appium的自動化測試框架完善的差不多了,那麼接下來宏哥繼續給小夥伴和童鞋們分享有關Appium自動化測試框架綜合實踐。想必小夥伴們有點等不及了吧!

driver配置封裝

kyb_caps.yaml 配置表

主要是一些配置信息的封裝。

 參考代碼

platformName: Android
#模擬器
platformVersion: 5.1.1
deviceName: 127.0.0.1:62025

#mx4真機
#platformVersion: 5.1
#udid: 750BBKL22GDN
#deviceName: MX4

appname: kaoyan3.1.0.apk
noReset: False
unicodeKeyboard: True
resetKeyboard: True

appPackage: com.tal.kaoyan
appActivity: com.tal.kaoyan.ui.activity.SplashActivity
ip: 127.0.0.1
port: 4723

desired_caps.py

主要是用來讀取配置文件的信息的封裝。

 參考代碼

# coding=utf-8
# 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行

# 2.註釋:包括記錄創建時間,創建人,項目名稱。
'''
Created on 2019-11-14
@author: 北京-宏哥   QQ交流群:707699217
Project:Appium自動化測試框架綜合實踐 - 代碼實現
'''
# 3.導入模塊
from appium import webdriver
import yaml
import logging
import logging.config
import os

CON_LOG='../config/log.conf'
logging.config.fileConfig(CON_LOG)
logging=logging.getLogger()

def appium_desired():
    with open('../config/kyb_caps.yaml','r',encoding='utf-8') as file:
        data=yaml.load(file)

    desired_caps={}
    desired_caps['platformName']=data['platformName']
    desired_caps['platformVersion']=data['platformVersion']
    desired_caps['deviceName']=data['deviceName']

    base_dir = os.path.dirname(os.path.dirname(__file__))
    app_path = os.path.join(base_dir, 'app', data['appname'])
    desired_caps['app']=app_path

    desired_caps['appPackage']=data['appPackage']
    desired_caps['appActivity']=data['appActivity']
    desired_caps['noReset']=data['noReset']


    desired_caps['unicodeKeyboard']=data['unicodeKeyboard']
    desired_caps['resetKeyboard']=data['resetKeyboard']

    logging.info('start app...')
    driver=webdriver.Remote('http://'+str(data['ip'])+':'+str(data['port'])+'/wd/hub',desired_caps)
    driver.implicitly_wait(8)
    return driver

if __name__ == '__main__':
    appium_desired()

    # with open('../config/kyb_caps.yaml', 'r', encoding='utf-8') as file:
    #     data = yaml.load(file)
    #
    # base_dir=os.path.dirname(os.path.dirname(__file__))
    # print(os.path.dirname(__file__))
    # print(base_dir)
    #
    # app_path=os.path.join(base_dir,'app',data['appname'])
    # print(app_path)

相對路徑符號含義

  1. “.”表示當前目錄
  2. “..” 表示當前目錄的上一級目錄。
  3. “./”表示當前目錄下的某個文件或文件夾,視後面跟着的名字而定
  4. “../”表示當前目錄上一級目錄的文件或文件夾,視後面跟着的名字而定。

基類封裝

baseView.py

主要是一些元素定位方法的封裝。

 參考代碼

# coding=utf-8
# 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行

# 2.註釋:包括記錄創建時間,創建人,項目名稱。
'''
Created on 2019-11-14
@author: 北京-宏哥   QQ交流群:707699217
Project:Appium自動化測試框架綜合實踐 - 代碼實現
'''
# 3.導入模塊
class BaseView(object):
    def __init__(self,driver):
        self.driver=driver

    def find_element(self,*loc):
        return self.driver.find_element(*loc)

    def find_elements(self,*loc):
        return self.driver.find_elements(*loc)

    def get_window_size(self):
        return self.driver.get_window_size()

    def swipe(self,start_x, start_y, end_x, end_y, duration):
        return self.driver.swipe(start_x, start_y, end_x, end_y, duration)

common公共模塊封裝

公共方法封裝 : common_fun.py

主要是一些公共方法的封裝。

參考代碼

# coding=utf-8
# 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行

# 2.註釋:包括記錄創建時間,創建人,項目名稱。
'''
Created on 2019-11-13
@author: 北京-宏哥   QQ交流群:707699217
Project:Appium自動化測試框架綜合實踐 - 代碼實現
'''
# 3.導入模塊
from kyb_testProject.baseView.baseView import BaseView
from kyb_testProject.common.desired_caps import appium_desired
from selenium.common.exceptions import NoSuchElementException
import logging
from selenium.webdriver.common.by import By
import time,os
import csv

class Common(BaseView):
    cancelBtn=(By.ID,'android:id/button2')
    skipBtn=(By.ID,'com.tal.kaoyan:id/tv_skip')
    wemedia_cacel=(By.ID,'com.tal.kaoyan:id/view_wemedia_cacel')


    def check_cancelBtn(self):
        logging.info('==========check_cancelBtn=========')
        try:
            cancelBtn = self.driver.find_element(*self.cancelBtn)
        except NoSuchElementException:
            logging.info('no cancelBtn')
        else:
            cancelBtn.click()

    def check_skipBtn(self):
        logging.info('=========check skipBtn=============')

        try:
            skipBtn = self.driver.find_element(*self.skipBtn)
        except NoSuchElementException:
            logging.info('no skipBtn')
        else:
            skipBtn.click()

    def get_size(self):
        x = self.driver.get_window_size()['width']
        y = self.driver.get_window_size()['height']
        return x, y

    def swipeLeft(self):
        logging.info('swipeLeft')
        l = self.get_size()
        x1 = int(l[0] * 0.9)
        y1 = int(l[1] * 0.5)
        x2 = int(l[0] * 0.1)
        self.swipe(x1, y1, x2, y1, 1000)

    def getTime(self):
        self.now=time.strftime("%Y-%m-%d %H_%M_%S")
        return self.now

    def getScreenShot(self,module):
        time=self.getTime()
        image_file=os.path.dirname(os.path.dirname(__file__))+'/screenshots/%s_%s.png' %(module,time)

        logging.info('get %s screenshot' %module)
        self.driver.get_screenshot_as_file(image_file)

    def check_market_ad(self):
        logging.info('====check_market_ad====')
        try:
            element=self.driver.find_element(*self.wemedia_cacel)
        except NoSuchElementException:
            pass
        else:
            logging.info('close market ad')
            element.click()

    def get_csv_data(self,csv_file,line):
        logging.info('=====get_csv_data======')
        with open(csv_file,'r',encoding='utf-8-sig') as file:
            reader=csv.reader(file)
            for index,row in enumerate(reader,1):
                if index==line:
                    return row

if __name__ == '__main__':
    # driver=appium_desired()
    # com=Common(driver)
    # com.check_cancelBtn()
    # # com.check_skipBtn()
    # com.swipeLeft()
    # com.getScreenShot('startApp')

    list = ["", "", "一個", "測試", "數據"]
    # for i in range(len(list)):
        # print(i, list[i])

    list1 = ["", "", "一個", "測試", "數據"]
    # for index, item in enumerate(list1):
    #     print(index, item)

小結

     好了,今天的分享就到這裏。感謝您耐心的閱讀!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開