高度なPYTHON
Pythonの反復
@ジェネレーター(発電機)
一覧リストビルダは非常に、我々は時間を用いた計算に単一の要素上で動作しているたびにメモリスペースを取る生成するので、他の要素は、スペースが無駄になり占めます。リストの要素は、いくつかのアルゴリズムに従って推定することができそうだとすれば、私たちは、サイクルで継続できることを計算次の要素にするために、(一度だけ計算された)完全なリストおよびメモリ集約を作成しないように。
Pythonでは、私たちは、計算循環させながら発電:発電機と呼ばれるメカニズムを。
文法Builderが作成しました
括弧をラップするブラケットビルダーリスト[]()ラッピング
# 列表生成器
data = [x + 1 for x in range(0, 10)]
print(data) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 生成器
g = (x * x for x in range(10))
print(g) # <generator object <genexpr> at 0x10a4d6318>
ビルダートラバーサル
利用発電要素も非常に簡単です、それは直接リサイクルプリントアウトすることができます
注:発電機がオーバー作成し、一度だけ消費します。二回目を横断するときトラバーサルは一度、リストがすでに空である場合にはあります
# 使用for循环
for i in g:
print(i)
# 直接使用list打印输出
g = (x for x in range(10))
list(g) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
また、最後の要素の計算された位置まで、次の関数を呼び出すことができますが、このアプローチが適用されないことは明らかである、そして最終的に呼び出すとStopIterationエラーがスローされます
g = (x * x for x in range(10))
next(g) # 逐个输出元素,遍历完后会抛出StopIteration异常
外挿アルゴリズムが複雑な場合の発電機を作成した私たちは、基本的には(次を呼び出すことはありません)が、用を反復処理するループ、および呼び出すとStopIterationエラーを気にしない、発電機は、リスト生成の同様のタイプで、非常に強力です循環のための時間を達成することができない、また、機能として実装することができます。
@イテレータ
反復可能(反復処理可能)とは何ですか?
反復処理可能:オブジェクトをまとめて反復可能と称するサイクルのために使用することができます。同様に、上述の発電機が反復可能であり、そのような集約データタイプ、リスト、タプル、辞書、集合、等STRの学習前。
反復子(イテレータ)とは何ですか?
できる次の()関数であるオブジェクトを返すへの呼び出しを次の値は、連続的に反復子を記します。例えば、発電機は、イテレータのようなものが、リスト、辞書、strのではなく、イテレータです。どのようなメカニズムは毛布?反復子が属するデータストリーム、未知の長さの不活性配列(すぐ下)を、
from collections.abc import Iterable,Iterator
a = [1,2,3,4]
g = (i for i in range(10))
isinstance(a, Iterable) # True
isinstance(a, Iterator) # False
isinstance(g, Iterator) # True
# iter方法可以将生成器转化为迭代器
next(iter(a)) # 1
関数型プログラミング
@高階関数
変数は、関数名は変数である関数を指すことができ、関数名は、lenの()関数のような関数を指すように可変である、我々は、変数LENとして見ることができます
関数に渡された変数は、関数は、変数受け入れることができる機能を指すことができるので、関数は、渡されたパラメータなどの別の機能を受け入れることができます
x = len
x([i for i in range(5)]) # 5
def add(x, y, z):
return z(x) + z(y)
add([1,2,3,4], [4,3,1,5,6], max) # 10
@マップ/削減
被験者は、反復(反復処理可能)であり、二つの引数、受信機能をマッピングする、関数の配列の各要素が作用します。
(反復処理可能)まだ反復可能な機能のリターンをマップします。
# 将下面的序列元素与自身相乘
map(lambda x: x * x, [1, 2, 3])
# 别忘记之前通过list包裹可迭代对象的例子
list(map(lambda x: x * x, [1, 2, 3])) # [1, 4, 9]
また、受信した二つの引数、機能を低下させる、対象は、反復を(反復処理可能)であるが、この関数は、2つのパラメータを受け入れる低減しなければならない計算を続ける次の要素にするために累積的基礎を。
関数は、最終的な計算結果を返し減らします。
from functools import reduce
reduce(lambda a,b: a+b, [1,2,3,4,5]) # 15
@Filter機能
フィルタはまた、2つの引数、関数を受信して、被験体は、反復(反復処理可能)であるが、結果が関数によって返されなければならないブール値であり、保持および削除するためのフィルタエレメントtrueまたはfalseに係ります
まだ反復可能なフィルタ機能戻る(反復処理可能)。
# 对下列数据只保留能被2整除的数
list(filter(lambda x: x % 2 == 0, [1,2,3,4,5])) # [2, 4]
@匿名関数ラムダ
私たちは、あなたが匿名関数を使用できるように関数名は、表示することができません定義されました。
匿名関数は変数に保存することができ、あなたが直接保存することはできません。
# 用变量保存
f = lambda x : x * 2
list(map(f, [1,2,3])) # [2, 4, 6]
# 直接使用
list(map(lambda x: x * 2, [1, 2, 3])) # [2, 4, 6]
三項演算子@
- [真]の場合、[式]他[偽]
print("成年人") if 24 > 18 else print("未成年人")
list(map(lambda x: x ** 2 if x % 2 == 0 else x, [1,2,3,4,5]))
コレクションクラス
@deque
ある両端キューと類似の利用リスト、のキュー(FIFO)を実現スタック(ラスト・アウト)のための缶順序付けられたシーケンスデータの操作が終了します。
両端キュー支持体の両方の配列の末端またはOの時間複雑さを追加ポップ(1)です。リストはまた、同様の動作を達成することができるが、その複雑さはO(N)です。
from collections import deque
# 创建
d = deque([1,2,3])
# 添加
d.append(4) # deque([1, 2, 3, 4])
d.appendleft(0) # deque([0, 1, 2, 3, 4])
# 删除
d.pop() # deque([0, 1, 2, 3])
d.popleft() # deque([1, 2, 3])
# 旋转
d.rotate(2) # deque([2, 3, 1])
時間計算効率、および両端キュー比較リストデータは、魔法の機能はtimeitを通じて左側に挿入されています
list_a = [x for x in range(1,1000000)]
deque_a = deque(list_a)
%timeit list_a.insert(0, 'a')
%timeit deque_a.appendleft('a')
実行
1.72 ms ± 196 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
234 ns ± 16.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
@CounterとOrderedDict
カウンタ
Aカウンターがあるdictのサブクラスのためのハッシュ可能オブジェクトを数えます。それは順不同コレクションの要素は辞書のキーとして格納されていると、そのカウントが辞書の値として格納されています。カウントがゼロまたは負のカウントを含む任意の整数値であることが許されます。
from collections import Counter
# 创建
a = list('Jeff')
c = Counter(a) # Counter({'J': 1, 'e': 1, 'f': 2})
# 遍历,子类具有父类的全部属性和方法
for k, v in c.items():
print(k, v)
# 查看Top1的元素
c.most_common(1) # [('f', 2)]
OrderedDict
そしてカウンター似ていますが、OrderedDictは、順序付けられ乱れやカウンター
from collections import OrderedDict
# unsorted dictionary
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
# sorted by key
OrderedDict(sorted(d.items(), key=lambda t: t[0]))
# sorted by value
OrderedDict(sorted(d.items(), key=lambda t: t[1]))
# sorted by length of the key string
OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
r.popitem(last=False) # ('pear', 1)
文字列処理
一般的な治療法@
s = " Hello, World "
len(s)
s.split(' ')
s.lstrip()
# 查找和替换
s.endswith(" ")
s.startswith(" ")
s.find("ll")
s.replace("World", 'Tomorrow')
# 去空格转成大写并按逗号分隔
list(map(lambda t: t.strip(), s.strip().upper().split(","))) # ['HELLO', 'WORLD']
@フォーマット
t = '五'
a = 3.1415
print("星期%s" %t) # 星期五
# 保留2位小数
print("pi是%.2f" %a) # pi是3.14
# format写法(推荐这样写)
a = '2019-12-12'
b = '10'
print("{0}的温度是{1}度".format(a, b)) # 2019-12-12的温度是10度
授業時間:日時
datimeクラスモジュールは、時間を処理するために設計され、それが1つのPythonの標準ライブラリであり、複雑で強力な内容は、これが唯一の一般的に使用される多くの機能が含まれます。
- 取得時間
- 文字列の時間の変換
- 抽出の時間
- 日付の間で計算
# 获取时间
from datetime import datetime
print(datetime.now()) # 2019-12-13 21:32:25.754216
# 创建指定的时间
dt = datetime(2019, 12, 13, 20, 11) # 2019-12-13 20:11:00
print(dt)
# 字符串与时间的转换
s1 = '20170901'
s1 = datetime.strptime(s1, '%Y%m%d')
s2 = "2019/05/03"
s2 = datetime.strptime(s2, '%Y/%m/%d')
s3 = "2019-09-17 20"
s3 = datetime.strptime(s3, '%Y-%m-%d %H')
# 时间的提取
dt.date()
datetime.now().date() # datetime.date(2019, 12, 13)
# 属性year,month,day,hour,minute,second
dt.year # 2019
# 日期间的计算
from datetime import datetime, timedelta
print(s3 - s1) # 746 days, 20:00:00
s3 - timedelta(days=1, seconds=86400, hours=12, minutes=60) # datetime.datetime(2019, 9, 15, 7, 0)
I / O
@ファイルを読みます
我々のデータは、一般的にファイルに存在し、プログラムはそれのpythonを使用して分析することができるように、Python環境にファイルをロードする必要があります。
Pythonの標準ライブラリには、私たちが一緒に見て、いくつかの標準の実装を提供します。
読むのファイルは、open()関数は、ファイル名と識別子のパラメータが必要です。
f = open("test2.txt", 'r', encoding="gbk") # 指定文件编码和模式
data = f.readline()
f.close()
print(data)
「R」がファイル手段を読み取る表し、データを読み出す読み出し機能を使用して、ファイルを取得した後、最後のステップは、ファイルを閉じるために、close()メソッドを呼び出すことです。ファイルオブジェクトは、オペレーティングシステムのリソースを占有しますので、ファイルの後、使用後に閉じていなければなりません。しかし、それぞれが多くの問題を書いて、私たちは、キーワードと統合するために使用することができます。
with open("test2.txt", 'r', encoding="gbk") as handle:
data = handle.readlines()
print(data) # ['hello world\n', '\n', 'Today is 星期二']
list(map(lambda s : s.strip(),data)) # ['hello world', '', 'Today is 星期二']
書き込みファイル@
書き込みファイルとほぼ同じ文書を読んで、唯一の違いは、「W」に変更するための識別子が必要です。
最初の引数は開きたいファイルの名前です。
(「W」)第二引数は、Pythonを伝え、私たちは書き込みモードでこのファイルを開きたいです。読み取りモード(R「」)指定されたファイルを開くと、書き込みモード(「W」)、追加モード(「」)、またはファイルに書き込ま読んで、モード(R「+」)することができましょう。場合
あなたは、引数のモードを省略し、Pythonは読み取り専用モードファイルを開くようにデフォルト設定されます
with open("test2.txt",'w') as handle:
handle.write("hello world\n") # 注意,这里手动添加了换行符
handle.write(" And fate")
あなたが存在しないファイルを書き込みたい場合は、open()関数が自動的に作成されます。指定されたファイルがすでに存在する場合、Pythonはファイルオブジェクトを返す前に、ファイルを消去しますのでただし、書き込み(「W」)モードにするために、注意しなければ、ファイルを開くとき。
ファイルに添付
あなたの代わりに、既存のコンテンツを上書きするファイルを与えるためにコンテンツを追加する場合は、追加モードでファイルを開くことができます。あなたは追加モードでファイルを開くと、Pythonはファイルオブジェクトを返す前にファイルをクリアしません、あなたはファイルの行への書き込みは、ファイルの末尾に追加されます。指定されたファイルが存在しない場合、Pythonはあなたは空のファイルを作成します。
with open("test.txt",'a') as handle:
handle.write("Today is Nice!\n")
handle.write("We are happy!!\n")
例外処理
Pythonは、プログラムの実行中に発生する管理エラーに例外と呼ばれる特殊なオブジェクトを使用しています。エラーは、Pythonの損失が、それは例外オブジェクトを作成するように発生するたびに。あなたは例外(つまりキャプチャ)を処理するコードを記述する場合、プログラムは実行を継続します。あなたは異常処理(捕獲されていない)でない場合、プログラムは例外に関するレポートが含まれているトレースバックを停止し、表示されます。
例外は、try-除くブロック処理を使用しています。トライ以外のブロックPythonのように、指定された操作の実装では、どのように行うには異常知っていれば。try-除くブロックを使用する場合は、例外が発生した場合でも、プログラムは実行を継続します:ユーザー混乱トレースバックを作るのではなく、書き込みフレンドリーエラーメッセージを表示します。
while True:
first_number = input("First Number: ")
if first_number == 'q':
break
second_number = input("Second Number: ")
if second_number == 'q':
break
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError as e:
print(" 除数不可以为0!!")
print(answer)
実行
First Number: 10
Second Number: 2
5.0
First Number: 3
Second Number: 5
0.6
First Number: 10
Second Number: 0
除数不可以为0!!
複数の例外
some_list = [1, 2, 3]
try:
print(some_list[5])
some_list.remove(4)
# except Exception as e: # 也可以用Exception替代,不过不建议这样做
except (IndexError, ValueError) as e: # 使用tuple封装多个异常类型
print("Caught again!")
print(e)