このセクションの内容
関数の基本的な構文と特性
パラメータとローカル変数
戻り値
ネストされた機能
再帰
匿名機能
機能プログラミング入門
高次関数
内蔵機能
主な効果:
>>> a ={1,2,3,4}>>> b ={3,4,5,6}>>> a
{1,2,3,4}>>> type(a)<class'set'>>>> a.symmetric_difference(b){1,2,5,6}>>> b.symmetric_difference(a){1,2,5,6}>>>>>>>>> a.difference(b){1,2}>>> a.union(b){1,2,3,4,5,6}>>> a.issu
a.issubset( a.issuperset(>>> a.issubset(b)
False
読み取り専用リスト、カウントおよびインデックス2メソッドのみ
機能:一部のデータが他のデータによって変更されたくない場合は、IDカードのリストなどのタプルとして保存できます。
クエリ速度が速いのはなぜですか?ハッシュタイプなので、ハッシュとは何ですか?
ハッシュアルゴリズムは、任意の長さのバイナリ値をより短い固定長のバイナリ値にマッピングし、この小さなバイナリ値はハッシュ値と呼ばれます。ハッシュ値は、データの一部を表す一意で非常にコンパクトな数値表現です。プレーンテキストの一部をハッシュし、その段落の1文字だけを変更した場合でも、その後のハッシュでは異なる値が生成されます。同じ値としてハッシュされた2つの異なる入力を見つけることは計算上不可能であるため、データのハッシュ値はデータの整合性をチェックできます。一般的に高速検索および暗号化アルゴリズムに使用されます
dictはすべてのキーをハッシュテーブルに変換してからテーブルを並べ替えます。そのため、data [key]を使用してデータディクショナリでキーを検索すると、pythonは最初にキーを数値にハッシュし、次にこれを取得します番号はハッシュテーブルに表示されません。表示されている場合は、ハッシュテーブルのキーのインデックスを取得し、インデックスを取得して、キーに対応する値のメモリアドレスの値を取得します。
上記の答えはまだありませんが、リストよりもデータを見つける方が速いのはなぜですか?ハハ、クラスでの私の発表を待ってください。
**python2 **について話させてください
**python3 **について話しましょう
より多くのコーディングアプリケーションを使用するシナリオはクローラーである必要があります。インターネット上の多くのWebサイトは、非常に複雑なコーディング形式を使用しています。全体的な傾向はutf-8になっていますが、現在でも非常に複雑であるため、Webページをクロールするときにさまざまなコーディングを実行する必要があります。変換しますが、人生は良くなり、トランスコーディングのない世界を楽しみにしています。
最後に、コーディングはクソの一部です、誰もそれが好きではありません。
これで、上司からサーバーのシステムステータスを監視する監視プログラムを作成するように求められました。cpu\ memory \ diskおよびその他のインジケーターの使用量がしきい値を超えると、電子メールアラートが送信されます。すべての知識を空にして、次のコードを記述しました。
while True:
cpu使用率の場合>90%:
# メールリマインダーを送信する
メールボックスサーバーに接続します
メールを送る
接続を閉じます
ハードディスク使用スペースの場合>90%:
# メールリマインダーを送信する
メールボックスサーバーに接続します
メールを送る
接続を閉じます
メモリ使用量の場合>80%:
# メールリマインダーを送信する
メールボックスサーバーに接続します
メールを送る
接続を閉じます
上記のコードは機能を実現していますが、隣のファラオも手がかりを見て、ファラオは息子の顔に愛情を込めて触れ、繰り返しコードが多すぎると言ったので、警察に電話するたびに段落を書き直す必要があります。メールを送信するためのコードが低すぎます。これを行うには2つの問題があります。
ラオ・ワンの言ったことは正しいと思いますか。繰り返しのコードを書きたくないのですが、その方法がわかりません。ラオ・ワンはあなたの心を見ていたようです。このとき、彼はあなたの息子を迎えに来て、笑顔で言いました。実際にはとても簡単で、必要なだけです。繰り返されるコードを抽出し、公共の場所に置いて名前を付けます。将来このコードを使用したい人は、次のようにこの名前で呼び出すことができます。
defメールを送信(コンテンツ)
# メールリマインダーを送信する
メールボックスサーバーに接続します
メールを送る
接続を閉じます
while True:
cpu使用率の場合>90%:メールを送る('CPUアラーム')ハードディスク使用スペースの場合>90%:メールを送る('ハードディスクアラーム')メモリ使用量の場合>80%:メールを送る('メモリーアラーム')
Lao Wangが書いたコードを見ると、壮大で荘厳です。コードには傲慢さが抑えられています。LaoWangは本当に珍しいと思いますが、突然、彼の背景に興味を持つようになりました。LaoWangに聞いてください。 、これらの派手なゲームをどうやって知っていますか?老王はあなたの息子にキスをし、存在しない髭を撫でて、かすかに言いました。「老人、私は若い頃、ジンシー・シャヘの銀の角の王に師事しました。」「銀の角の王」という言葉を聞くと、私は身震いし、「本当にnbです。コードが書かれているのも不思議ではありません。6、この「シルバーホーンキング」は当時の川や湖でよく知られた名前でしたが、彼が後期に過度に甘やかされ、2016年に亡くなったことは残念です。二人の兄弟が一緒に戦った国を守るために彼の兄弟だけが一人にされているのは残念です。この瞬間、あなたはラオス・ワンが去る姿を見て、あなたの息子はますます彼に似ているように感じます。 。 。
関数という言葉は数学に由来しますが、プログラミングにおける「関数」の概念は、数学における関数の概念とは大きく異なります。具体的な違いについては、後で説明しますが、プログラミングにおける関数にはさまざまな名前があります。 。これは、BASICではサブルーチン、Pascalではプロシージャと関数、Cでは関数のみ、Javaではメソッドと呼ばれます。
特性:
def sayhi():#関数名
print("Hello, I'm nobody!")sayhi() #関数を呼び出す
パラメータを取ることができます
# 次のコード
a,b =5,8
c = a**b
print(c)
# 関数を使用して書き込むように変更
def calc(x,y):
res = x**y
return res #関数の実行結果を返す
c =calc(a,b)#結果はc変数に割り当てられます
print(c)
正式なパラメータ変数は、呼び出されたときにのみメモリユニットを割り当て、呼び出しの終了時に割り当てられたメモリユニットをすぐに解放します。したがって、正式なパラメータは関数内でのみ有効です。関数呼び出しが終了してメイン呼び出し関数に戻ると、正式なパラメーター変数は使用できなくなります。
実際のパラメーターは、定数、変数、式、関数などにすることができます。実際のパラメーターの量の種類に関係なく、これらの値を正式なパラメーターに転送するには、関数を呼び出すときに特定の値が必要です。したがって、パラメータの特定の値を取得するには、事前に割り当て、入力、およびその他の方法を使用する必要があります
デフォルトパラメータ
以下のコードを見てください
def stu_register(name,age,country,course):print("----登録学生情報------")print("名前:",name)print("age:",age)print("国籍:",country)print("コース:",course)stu_register("ワンシャンパオ",22,"CN","python_devops")stu_register("張嘉春",21,"CN","linux")stu_register("劉老原",25,"CN","linux")
国のパラメータは基本的に「CN」であることがわかりました。ウェブサイトでユーザーを登録するときと同じように、国籍などの情報を入力しないと、デフォルトは中国になります。これは、デフォルトのパラメータによって実現され、国がデフォルトのパラメータになります。とてもシンプル
def stu_register(name,age,course,country="CN"):
このように、このパラメーターは呼び出し時に指定されず、デフォルトはCNです。指定されている場合は、指定した値が使用されます。
また、国をデフォルトのパラメータにした後、その位置を後ろに移動したことにお気づきかもしれませんが、なぜですか?
通常の状況では、パラメーターを順番に関数に渡す必要があります。順番にしたくない場合は、キーパラメーターを使用できます。パラメーター名を指定するだけです。***ただし、キーパラメーターは位置パラメーターの後に配置する必要があることに注意してください。 ***
stu_register(age=22,name='alex',course="python",)
固定されていないパラメータ
関数が定義されたときにユーザーが渡したいパラメーターの数がわからない場合は、固定されていないパラメーターを使用できます。
def stu_register(name,age,*args): # *argsは、複数の入力パラメーターをタプル形式に変換します
print(name,age,args)stu_register("Alex",22)
# 出力
# Alex 22() #この後ろに()引数です,価値がないからといって,とても空
stu_register("Jack",32,"CN","Python")
# 出力
# Jack 32('CN','Python')
** kwargsもあります
def stu_register(name,age,*args,**kwargs): # *kwargsは、複数の着信パラメーターをdict形式に変換します
print(name,age,args,kwargs)stu_register("Alex",22)
# 出力
# Alex 22(){}#この後ろに{}クワーグ,価値がないからといって,とても空
stu_register("Jack",32,"CN","Python",sex="Male",province="ShanDong")
# 出力
# Jack 32('CN','Python'){'province':'ShanDong','sex':'Male'}
name ="Alex Li"
def change_name(name):print("before change:",name)
name ="ゴールデンホーン,テスラの男"print("after change", name)change_name(name)print("外で名前を変えましたか??",name)
出力
before change: Alex Li
変更後ゴールデンホーンキング,テスラの男
外で名前を変えましたか?? Alex Li
グローバル変数とローカル変数
サブプログラムで定義された変数はローカル変数と呼ばれ、プログラムの最初で定義された変数はグローバル変数と呼ばれます。
グローバル変数スコープはプログラム全体であり、ローカル変数スコープは変数を定義するサブルーチンです。
グローバル変数がローカル変数と同じ名前の場合:
ローカル変数が定義されているサブルーチンでは、ローカル変数が機能し、グローバル変数は他の場所で機能します。
関数の実行結果を取得するには、returnステートメントを使用して結果を返します。
注意:
上記のタイトルは、関数が関数としても使用できることを意味しますか?もちろん
name ="Alex"
def change_name():
name ="Alex2"
def change_name2():
name ="Alex3"print("レイヤー3印刷",name)change_name2() #内部関数を呼び出す
print("レイヤー2印刷",name)change_name()print("最外の印刷",name)
この時点で、最外層でchange_name2()を呼び出すとどのような影響がありますか?
はい、何かがうまくいかなかったのはなぜですか?
ネストされた関数の使用法はより良くなりますが、それはどのような用途ですか?次のクラスが発表されます。 。 。
関数内では、他の関数を呼び出すことができます。関数がそれ自体を内部的に呼び出す場合、その関数は再帰的です。
def calc(n):print(n)ifint(n/2)==0:return n
returncalc(int(n/2))calc(10)
出力:
10521
再帰的特性:
明確な終了条件が必要です
より深い再帰を入力するたびに、最後の再帰と比較して問題のサイズを小さくする必要があります
再帰効率は高くありません。再帰のレベルが多すぎると、スタックがオーバーフローします(コンピューターでは、関数呼び出しはスタックのデータ構造を介して実装されます。関数呼び出しが入力されるたびに、スタックはスタックフレームを追加します。関数が戻ると、スタックは1スタックフレーム減少します。スタックのサイズは無限ではないため、再帰呼び出しが多すぎるとスタックがオーバーフローします)
再帰関数、バイナリ検索の実用的なアプリケーションケース
data =[1,3,6,7,9,12,14,16,17,18,20,21,22,23,30,32,33,35]
def binary_search(dataset,find_num):print(dataset)iflen(dataset)>1:
mid =int(len(dataset)/2)if dataset[mid]== find_num: #find it
print("番号を見つける",dataset[mid])
elif dataset[mid]> find_num :#見つかった番号は中央の左側にあります
print("\033[31;1mは真ん中の数を見つけます[%s]左\033[0m"% dataset[mid])returnbinary_search(dataset[0:mid], find_num)else:#お探しの番号は真ん中の右側です
print("\033[32;1mは真ん中の数を見つけます[%s]正しい\033[0m"% dataset[mid])returnbinary_search(dataset[mid+1:],find_num)else:if dataset[0]== find_num: #find it
print("番号が見つかりました",dataset[0])else:print("ポイントなし,あなたが探している数[%s]リストにありません"% find_num)binary_search(data,66)
匿名関数は、関数を明示的に指定する必要がないことを意味します
# このコード
def calc(n):return n**n
print(calc(10))
# 匿名機能への変更
calc = lambda n:n**n
print(calc(10))
これを使うのは不便だと言うかもしれません。 。 。 。ははは、このように使用した場合、実際には糸の改良はありませんが、匿名機能は主に次のように他の機能と組み合わせて使用されます
res =map(lambda x:x**2,[1,5,7,4,8])for i in res:print(i)
出力
1
25
49
16
64
関数は、組み込みのPythonでサポートされている一種のカプセル化です。大きなコードを関数に分割し、関数をレイヤーごとに呼び出すことで、複雑なタスクを単純なタスクに分解できます。この分解は、プロセス指向と呼ぶことができます。プログラムの設計。機能は、プロセス指向プログラミングの基本単位です。
**機能プログラミングにおける関数という用語は、コンピューター内の関数(実際にはサブルーチン)を指すのではなく、指数科学における関数、つまり独立変数のマッピングを指します。つまり、関数の値は関数パラメーターの値によってのみ決定され、他の状態には依存しません。たとえば、sqrt(x)関数はxの平方根を計算します。xが変化しない限り、値はいつ呼び出されても、何回呼び出されても同じままです。 ****
Pythonは、機能プログラミングを部分的にサポートしています。 Pythonでは変数の使用が許可されているため、Pythonは純粋に機能的なプログラミング言語ではありません。
1.定義
簡単に言えば、「機能プログラミング」は[「プログラミングパラダイム」](http://en.wikipedia.org/wiki/Programming_paradigm)(プログラミングパラダイム)であり、プログラムの書き方の方法論です。
主なアイデアは、可能な限り一連のネストされた関数呼び出しとして計算プロセスを記述することです。たとえば、次のような数式があります。
(1 + 2) * 3 - 4
従来の手続き型プログラミングでは、次のように書くことができます。
var a = 1 + 2;
var b = a * 3;
var c = b - 4;
機能プログラミングでは関数を使用する必要があります。操作プロセスをさまざまな関数として定義し、次のように記述できます。
var result = subtract(multiply(add(1,2), 3), 4);
このコードの次の進化は次のようになります
add(1,2).multiply(3).subtract(4)
これは基本的に自然な言葉の表現です。次のコードをもう一度見てください。誰もがその意味を一目で理解できるはずです。
merge([1,2],[3,4]).sort().search("2")
したがって、機能プログラミングのコードは理解しやすいです。
機能的なプログラミングを上手に学びたいのなら、pyをプレイしないで、Erlang、Haskellをプレイしてください。そうですね、私にはできることはたくさんあります。 。 。
変数は関数を指すことができ、関数のパラメーターは変数を受け取ることができ、次にある関数が別の関数をパラメーターとして受け取ることができます。この種の関数は高次関数と呼ばれます。
def add(x,y,f):returnf(x)+f(y)
res =add(3,-6,abs)print(res)
詳細な組み込みパラメーターhttps://docs.python.org/3/library/functions.html?highlight=built#ascii
# compile
f =open("関数の再帰.py")
data =compile(f.read(),'','exec')exec(data)
# print
msg ="元の出発点に戻る"
f =open("tofile","w")print(msg,"記憶に残るあなたの緑の顔",sep="|",end="",file=f)
# # slice
# a =range(20)
# pattern =slice(3,8,2)
# for i in a[pattern]: #に等しい[3:8:2]
# print(i)
#
#
# memoryview
# usage:
#>>> memoryview(b'abcd')
#< memory at 0x104069648>
# データをスライスして割り当てる場合、元のリストデータを再度コピーする必要はなく、元のデータメモリを直接マッピングできます。
import time
for n in(100000,200000,300000,400000):
data = b'x'*n
start = time.time()
b = data
while b:
b = b[1:]print('bytes', n, time.time()-start)for n in(100000,200000,300000,400000):
data = b'x'*n
start = time.time()
b =memoryview(data)while b:
b = b[1:]print('memoryview', n, time.time()-start)
いくつかの組み込みメソッド使用リマインダー
以下の従業員情報テーブルがあります
もちろん、このテーブルは、[ファイルストレージ](https://cloud.tencent.com/product/cfs?from=10680)にいるときにこのように表現できます。
1, Alex Li,22,13651054608,IT,2013-04-01
ここで、従業員情報ファイルを追加、削除、変更、および確認する必要があります
ファジークエリを実行でき、構文は少なくとも次の3つのタイプをサポートします。
select name,age from staff_table where age > 22
select * from staff_table where dept = "IT"
select * from staff_table where enroll_date like "2013"
見つかった情報を印刷した後、見つかったピースの数が最後に表示されます
新しい従業員レコードを作成し、電話を一意のキーとして使用します。staff_idをインクリメントする必要があります
指定した従業員情報レコードを削除できます。削除する従業員IDを入力してください
従業員情報は変更できます。構文は次のとおりです。
UPDATE staff_table SET dept="Market" WHERE where dept = "IT"
** 注:上記の要件については、関数を最大限に活用するために、コードの重複を減らすために最善を尽くしてください! ****
Recommended Posts