Pythonの基本5

このセクションの内容

  1. 関数の基本的な構文と特性

  2. パラメータとローカル変数

  3. 戻り値

ネストされた機能

  1. 再帰

  2. 匿名機能

  3. 機能プログラミング入門

  4. 高次関数

  5. 内蔵機能

過去を振り返り、新しい###を知る

1. セットする####

主な効果:

  1. 重複排除
  2. 関係テスト、交差点\差分セット\ユニオン\逆(対称)差分セット
>>> 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. タプル####

読み取り専用リスト、カウントおよびインデックス2メソッドのみ

機能:一部のデータが他のデータによって変更されたくない場合は、IDカードのリストなどのタプルとして保存できます。

クエリ速度が速いのはなぜですか?ハッシュタイプなので、ハッシュとは何ですか?

ハッシュアルゴリズムは、任意の長さのバイナリ値をより短い固定長のバイナリ値にマッピングし、この小さなバイナリ値はハッシュ値と呼ばれます。ハッシュ値は、データの一部を表す一意で非常にコンパクトな数値表現です。プレーンテキストの一部をハッシュし、その段落の1文字だけを変更した場合でも、その後のハッシュでは異なる値が生成されます。同じ値としてハッシュされた2つの異なる入力を見つけることは計算上不可能であるため、データのハッシュ値はデータの整合性をチェックできます。一般的に高速検索および暗号化アルゴリズムに使用されます

dictはすべてのキーをハッシュテーブルに変換してからテーブルを並べ替えます。そのため、data [key]を使用してデータディクショナリでキーを検索すると、pythonは最初にキーを数値にハッシュし、次にこれを取得します番号はハッシュテーブルに表示されません。表示されている場合は、ハッシュテーブルのキーのインデックスを取得し、インデックスを取得して、キーに対応する値のメモリアドレスの値を取得します。

上記の答えはまだありませんが、リストよりもデータを見つける方が速いのはなぜですか?ハハ、クラスでの私の発表を待ってください。

4. 文字コード####

**python2 **について話させてください

  1. py2のデフォルトのエンコーディングはasciiです
  2. ファイルの先頭にあるエンコーディング宣言は、このコードをメモリに読み込むためのエンコーディング形式でコードを説明するプログラムに指示します。これは、メモリ内では、このコードは実際にはバイトバイナリ形式で格納されているためですが、バイナリストリームであっても、さまざまなエンコード形式に従ってバイナリストリームに変換することもできます。わかりますか?
  3. ファイルのヘッダーで#_ * _coding:utf-8 * _を宣言すると、中国語を書くことができます。宣言しない場合、このコードを処理するときにpythonがasciiを押すと、明らかにエラーになります。この宣言を追加した後、内部のコードはすべてutf-8形式です
  4. #_ * _coding:utf-8 * _の場合、変数を宣言しています。name= u "大健康"と書くと、この文字はユニコード形式になり、このuがない場合、宣言する文字列はutfになります。 -8フォーマット
  5. utf-8をgbkに変換する方法、utf8は最初にユニコードにデコードし、次にgbkにエンコードします

**python3 **について話しましょう

  1. py3のデフォルトのファイルエンコーディングはutf-8であるため、中国語を直接書き込むことができ、ファイルヘッダーでエンコーディングを宣言する必要はありません。これはすばらしいことです。
  2. 宣言する変数は、デフォルトではutf-8ではなくユニコードエンコーディングです。デフォルトはユニコードであるため(py2とは異なり、ユニコードを直接宣言する場合は、変数の前にuを追加する必要があります)、この時点でgbkに変換します。そうである場合は、直接your_str.encode( "gbk")を実行できます。
  3. しかし、py3では、your_str.encode( "gbk")にいるときに、アクションを追加したように感じます。つまり、エンコードされたデータがバイトになり、ワイプします。py3では、strまた、バイトは明確に区別されます。バイトはバイナリストリームであることが理解できます。010101のようなバイナリシステムは見当たらないと言えます。これは、pythonがデータを操作できるようにするためです。メモリレベルは、カプセル化のレイヤーを作成するのに役立ちます。そうしないと、一連のバイナリベースを直接確認できます。どの文字がどのバイナリベースに対応しているかを確認できますか?何?自分で変換して、さあ、2桁以上の数字を足したり引いたりするのに一生懸命努力する必要があるので、心配する必要はありません。
  4. そうすると、py2にはバイトがあるようですが、py2のバイトはstrのエイリアスにすぎず(python2のstrはバイト、py3のstrはユニコードです)、py3のようには表示されません。カプセル化の余分な層がありますが、実際には内部にカプセル化されています。ハードディスクからメモリまで、2または3のどちらであっても、データ形式は010101バイナリから-> b '\ xe4 \ xbd \ xa0 \ xe5 \ xa5 \ xbd'バイトタイプ--->指定されたエンコーディングに準拠します。あなたが理解できるテキスト

より多くのコーディングアプリケーションを使用するシナリオはクローラーである必要があります。インターネット上の多くのWebサイトは、非常に複雑なコーディング形式を使用しています。全体的な傾向はutf-8になっていますが、現在でも非常に複雑であるため、Webページをクロールするときにさまざまなコーディングを実行する必要があります。変換しますが、人生は良くなり、トランスコーディングのない世界を楽しみにしています。

最後に、コーディングはクソの一部です、誰もそれが好きではありません。

1. 関数の基本的な構文と機能###

バックグラウンドフィード####

これで、上司からサーバーのシステムステータスを監視する監視プログラムを作成するように求められました。cpu\ memory \ diskおよびその他のインジケーターの使用量がしきい値を超えると、電子メールアラートが送信されます。すべての知識を空にして、次のコードを記述しました。

while True:
 cpu使用率の場合>90%:
  # メールリマインダーを送信する
  メールボックスサーバーに接続します
  メールを送る
  接続を閉じます
     
 ハードディスク使用スペースの場合>90%:
  # メールリマインダーを送信する
  メールボックスサーバーに接続します
  メールを送る
  接続を閉じます
     
 メモリ使用量の場合>80%:
  # メールリマインダーを送信する
  メールボックスサーバーに接続します
  メールを送る
  接続を閉じます

上記のコードは機能を実現していますが、隣のファラオも手がかりを見て、ファラオは息子の顔に愛情を込めて触れ、繰り返しコードが多すぎると言ったので、警察に電話するたびに段落を書き直す必要があります。メールを送信するためのコードが低すぎます。これを行うには2つの問題があります。

  1. コードの繰り返しが多すぎる、一貫したコピーと貼り付けは、ハイエンドプログラマーの気質を満たしていません
  2. 大量メール送信機能の追加など、将来メールを送信するためのコードを変更する必要がある場合は、このコードが使用されているすべての場所を変更する必要があります

ラオ・ワンの言ったことは正しいと思いますか。繰り返しのコードを書きたくないのですが、その方法がわかりません。ラオ・ワンはあなたの心を見ていたようです。このとき、彼はあなたの息子を迎えに来て、笑顔で言いました。実際にはとても簡単で、必要なだけです。繰り返されるコードを抽出し、公共の場所に置いて名前を付けます。将来このコードを使用したい人は、次のようにこの名前で呼び出すことができます。

defメールを送信(コンテンツ)
 # メールリマインダーを送信する
 メールボックスサーバーに接続します
 メールを送る
 接続を閉じます
     
while True:
     
 cpu使用率の場合>90%:メールを送る('CPUアラーム')ハードディスク使用スペースの場合>90%:メールを送る('ハードディスクアラーム')メモリ使用量の場合>80%:メールを送る('メモリーアラーム')

Lao Wangが書いたコードを見ると、壮大で荘厳です。コードには傲慢さが抑えられています。LaoWangは本当に珍しいと思いますが、突然、彼の背景に興味を持つようになりました。LaoWangに聞いてください。 、これらの派手なゲームをどうやって知っていますか?老王はあなたの息子にキスをし、存在しない髭を撫でて、かすかに言いました。「老人、私は若い頃、ジンシー・シャヘの銀の角の王に師事しました。」「銀の角の王」という言葉を聞くと、私は身震いし、「本当にnbです。コードが書かれているのも不思議ではありません。6、この「シルバーホーンキング」は当時の川や湖でよく知られた名前でしたが、彼が後期に過度に甘やかされ、2016年に亡くなったことは残念です。二人の兄弟が一緒に戦った国を守るために彼の兄弟だけが一人にされているのは残念です。この瞬間、あなたはラオス・ワンが去る姿を見て、あなたの息子はますます彼に似ているように感じます。 。 。

機能とは何ですか?####

関数という言葉は数学に由来しますが、プログラミングにおける「関数」の概念は、数学における関数の概念とは大きく異なります。具体的な違いについては、後で説明しますが、プログラミングにおける関数にはさまざまな名前があります。 。これは、BASICではサブルーチン、Pascalではプロシージャと関数、Cでは関数のみ、Javaではメソッドと呼ばれます。

定義:関数とは、ステートメントのセットを名前(関数名)でカプセル化することを意味します。この関数を実行するには、関数名####を呼び出すだけです。

特性:

  1. 繰り返しのコードを減らす
  2. プログラムをスケーラブルにする
  3. プログラムの保守を容易にする

構文定義####

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)

2. 関数パラメーターとローカル変数###

正式なパラメータ変数は、呼び出されたときにのみメモリユニットを割り当て、呼び出しの終了時に割り当てられたメモリユニットをすぐに解放します。したがって、正式なパラメータは関数内でのみ有効です。関数呼び出しが終了してメイン呼び出し関数に戻ると、正式なパラメーター変数は使用できなくなります。

実際のパラメーターは、定数、変数、式、関数などにすることができます。実際のパラメーターの量の種類に関係なく、これらの値を正式なパラメーターに転送するには、関数を呼び出すときに特定の値が必要です。したがって、パラメータの特定の値を取得するには、事前に割り当て、入力、およびその他の方法を使用する必要があります

デフォルトパラメータ

以下のコードを見てください

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

グローバル変数とローカル変数

サブプログラムで定義された変数はローカル変数と呼ばれ、プログラムの最初で定義された変数はグローバル変数と呼ばれます。

グローバル変数スコープはプログラム全体であり、ローカル変数スコープは変数を定義するサブルーチンです。

グローバル変数がローカル変数と同じ名前の場合:

ローカル変数が定義されているサブルーチンでは、ローカル変数が機能し、グローバル変数は他の場所で機能します。

3. 戻り値###

関数の実行結果を取得するには、returnステートメントを使用して結果を返します。

注意:

  1. 関数が実行プロセス中にreturnステートメントに遭遇する限り、関数は実行を停止して結果を返します。したがって、関数の終了を表すreturnステートメントとしても理解できます。
  2. 関数でreturnが指定されていない場合、この関数の戻り値はNoneです。

ナレッジポイントを強制的に挿入します:ネストされた関数###

上記のタイトルは、関数が関数としても使用できることを意味しますか?もちろん

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()を呼び出すとどのような影響がありますか?

はい、何かがうまくいかなかったのはなぜですか?

ネストされた関数の使用法はより良くなりますが、それはどのような用途ですか?次のクラスが発表されます。 。 。

4. 再帰###

関数内では、他の関数を呼び出すことができます。関数がそれ自体を内部的に呼び出す場合、その関数は再帰的です。

def calc(n):print(n)ifint(n/2)==0:return n
 returncalc(int(n/2))calc(10)
 
出力:
10521

再帰的特性:

  1. 明確な終了条件が必要です

  2. より深い再帰を入力するたびに、最後の再帰と比較して問題のサイズを小さくする必要があります

  3. 再帰効率は高くありません。再帰のレベルが多すぎると、スタックがオーバーフローします(コンピューターでは、関数呼び出しはスタックのデータ構造を介して実装されます。関数呼び出しが入力されるたびに、スタックはスタックフレームを追加します。関数が戻ると、スタックは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)

5. 匿名関数###

匿名関数は、関数を明示的に指定する必要がないことを意味します

# このコード
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

6. 機能プログラミング入門###

関数は、組み込みの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をプレイしてください。そうですね、私にはできることはたくさんあります。 。 。

7. 高次関数###

変数は関数を指すことができ、関数のパラメーターは変数を受け取ることができ、次にある関数が別の関数をパラメーターとして受け取ることができます。この種の関数は高次関数と呼ばれます。

def add(x,y,f):returnf(x)+f(y)
 
 
res =add(3,-6,abs)print(res)

8. 組み込みパラメータ###

詳細な組み込みパラメーター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

ここで、従業員情報ファイルを追加、削除、変更、および確認する必要があります

  1. ファジークエリを実行でき、構文は少なくとも次の3つのタイプをサポートします。

  2. select name,age from staff_table where age > 22

  3. select * from staff_table where dept = "IT"

  4. select * from staff_table where enroll_date like "2013"

  5. 見つかった情報を印刷した後、見つかったピースの数が最後に表示されます

  6. 新しい従業員レコードを作成し、電話を一意のキーとして使用します。staff_idをインクリメントする必要があります

  7. 指定した従業員情報レコードを削除できます。削除する従業員IDを入力してください

  8. 従業員情報は変更できます。構文は次のとおりです。

  9. UPDATE staff_table SET dept="Market" WHERE where dept = "IT"

** 注:上記の要件については、関数を最大限に活用するために、コードの重複を減らすために最善を尽くしてください! ****

Recommended Posts

Pythonの基本
Pythonの基本2
Pythonの基本
Pythonの基本3
Pythonの基本4
Pythonの基本5
Pythonオブジェクト指向の基本
Pythonカスタム関数の基本
Python構文の基本
Pythonマルチスレッド
Python CookBook
Python3辞書
Python3モジュール
python(you-get)
Python文字列
Python記述子
Python exec
Pythonノート
Python3タプル
CentOS + Python3.6 +
Python Advanced(1)
Pythonデコレータ
Python IO
Pythonマルチスレッド
Pythonツールチェーン
Python3リスト
Pythonの概要
pythonの紹介
Pythonアナリティック
07.Python3関数
Pythonマルチタスクスレッド
Python関数
python sys.stdout
python演算子
Pythonエントリ-3
Centos 7.5 python3.6
Python文字列
pythonキューキュー
pythonインタラクティブモードの基本を学ぶ
Pythonの基礎を学ぶ2日間
Centos6はPython2.7.13をインストールします
Pythonは質問に答えます
Pythonの基本構文(1)
Pythonはloopメソッドを終了します
Ubuntu16アップグレードPython3
Centos7はPython3.6をインストールします。
ubuntu18.04インストールpython2
Pythonの古典的なアルゴリズム
ubuntuを再学習します--python3
Python文字列操作
Python研究ノート(1)
python学習ルート
Python3の基本構文
Pythonレビュー1
pythonの関数
Python学習変数タイプ
CentOSはPython3.6をインストールします
Python3.9の7つの機能
Pythonファイル操作
ubuntu12.04インストールpython3
Pythonのデザインパターン