ひそかにPythonを学び、みんなに衝撃を与えたい(翌日)

ここに写真の説明を挿入

タイトルは気分を害するものではありませんが、この広告は楽しいと思います
。よろしければ上記のマインドマップをご覧ください。とにかくあまり学ぶことができません。

序文

予備レビュー:Pythonを密かに学び、全員を驚かせたい(初日)。
上記の記事では、データ型から4つの算術演算、分岐とループまで、Pythonの基本的な知識について説明しました。

そこで本日は、より抽象的な関数とクラスについて見ていきます。基本に慣れていない場合は、基盤を固めることができます。結局のところ、基盤は正直ではなく、非常に危険です。

本系列文默认各位有一定的C或C++基础,因为我是学了点C++的皮毛之后入手的Python,这里也要感谢齐锋学长送来的支持。
本系列文默认各位会百度,会用在线编译器,因为我是突击学Python的,之前的编译环境都删了,但是吧,我发现在线编译是真的爽,浪费那时间去搭那环境干啥,学好了Python,会差那点请人搭环境的钱吗?

我要的不多,点个关注就好啦
然后呢,本系列的目录嘛,说实话我个人比较倾向于那两本 Primer Plus,所以就跟着它们的目录结构吧。

本系列也会着重培养各位的自主动手能力,毕竟我不可能把所有知识点都给你讲到,所以自己解决需求的能力就尤为重要,所以我在文中埋得坑请不要把它们看成坑,那是我留给你们的锻炼机会,请各显神通,自行解决。

では、トピックに移りましょう。


プログラミング学習のボトルネック

最初にもう少しリラックスして話しましょう、そして私はそれらの頑固に退屈なものについて話します。

基礎があるかどうか、プログラミングや数学を学んだかどうかに関係なく、多かれ少なかれ、困難に直面します。たとえば、プログラミングの学習中に最初に遭遇した問題は、機能の転送でした。うわー、当時、私は非常に元気でした。結局、私は90ポイントを超えて横に歩かなければならなかったC ++の人でした。しかし、会社でのトレーニングの初日、先生が私たちにコードの一部を見せてくれた(説明した)とき、それはデータタイプパラメータとしての構造であり、そのようなパラメータの束でした。同じ機能で。

それから別の場所、正確には別のファイルでこの関数を呼び出しました。そのとき、私はびっくりしました。画面を記録するのを忘れていました。実際の操作を待ちました。
何を渡すのですか?どこに行ったの?気絶。

さて、それは遠い道のりです。コメント領域で遭遇したボトルネックにぶつかることができます。多分あなたの思考と瞑想、他の人はすでに解決策を持っています。

山が山の障壁を通過するようにします。コードを理解できることは基本の最初のステップにすぎません。自分で作成する必要があります。自分で書くと色々な問題が発生しやすく、2つ目のハードルはデバッグです。

話が多すぎる場合は、これらのスキルをお教えします。この記事では、まず関数とクラスを見てから、サブファイルプロジェクト、デバッグ、基本的なプロジェクトの設計とアーキテクチャなどについて説明します。必要に応じて、フォローアップできます。


機能はそれほど怖くない

初期機能

関数?中学校の数学を学んだことのある人なら誰でも機能を知っています。
この機能はその機能ではありません。

関数は整理され、再利用可能であり、単一または関連するコードセグメントを実装するために使用されます
関数は、アプリケーションのモジュール性とコードの再利用を向上させることができます。Pythonがprint()などの多くの組み込み関数を提供することはすでにご存知でしょう。ただし、ユーザー定義関数と呼ばれる関数を自分で作成することもできます。

関数を定義する

写真は千の言葉の価値があります:
ここに写真の説明を挿入

例:

def math(x):
    y = 3*x + 5
    return y

この関数は、次のことを実現するために使用されます。y= 3x + 5の評価。ここで、xはパラメーターです。心配しないでください。ここには多くのルールがありますので、ゆっくり聞いてください。

まず第一に、pycharmのようなコンパイラはありますか?それは問題ではありません。「ProgrammingChina」のような多くのオンラインコンパイラがまだあり、Pythonプログラミングを選択します。
上記の段落を最初にコンパイルして実行すると、実行できない人はBaiduを実行できます。

走った後、何もないことがわかります。これは嘘ではありません。はい、これは嘘ではありません。私たちはそれを呼ばなかったので、当然何もありません。

機能ルール

函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(),括号后面要紧跟冒号,不然会报错。def就相当于告诉编译器:我这里是一个函数,你注意一下哈

任何传入参数必须放在圆括号中间,关于这个参数的规矩嘛:
1、在调用函数时,对函数进行参数传递必须与函数声明时的参数列表对应。
2、函数声明时可以声明默认参数,在函数调用时如果没有对默认参数进行传值,这默认参数使用预设值,默认参数要放在参数列表最右侧
3、函数外传参的参数数据类型须一一对应(有些可以强转,碧如floatint4、参数类型多种多样,并不局限于常见的intfloatstr等参数类型,也可以传类对象等

函数内容以冒号起始,并且缩进。

return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

对于函数的调用,直接输入函数名,并传入参数(这里不考虑跨文件)

具体的には、続きを読む。

例2:

# 定义函数
def printme( str ):
   "打印任何传入的字符串"
   print(str)
   return
 
# 调用函数
printme("我要调用用户自定义函数!")
printme("再次调用同一函数")

例3:

def menu(appetizer, course):
    print('一份开胃菜:' + appetizer)
    print('一份主食:' + course)
menu('话梅花生','牛肉拉面')
def list(list1,list2):
    print('fast food:'+list1)
    print('slow food:'+list2)
list('宫保鸡丁','水煮鱼')

結果:

一份开胃菜:话梅花生
一份主食:牛肉拉面
fast food:宫保鸡丁
slow food:水煮鱼

例4:

デフォルトのパラメータメソッド:

def menu(appetizer, course, dessert = '绿豆沙'):
    print('一份开胃菜:' + appetizer)
    print('一份主食:' + course)
    print('一份甜品:' + dessert)


menu('话梅花生','牛肉拉面')
menu('话梅花生','牛肉拉面','银耳羹')
#银耳羹对应参数dessert

結果:

一份开胃菜:话梅花生
一份主食:牛肉拉面
一份甜品:绿豆沙
一份开胃菜:话梅花生
一份主食:牛肉拉面
一份甜品:银耳羹

例5:

可変長パラメータ

そのフォーマットは特別で、アスタリスク*とパラメーター名であり、その戻り値も特別です。次の例を見てみましょう。

def menu(*barbeque):
    return barbeque

order = menu('烤鸡翅','烤茄子','烤玉米')
#括号里的这几个值都会传递给参数barbeque

print(order)
print(type(order))

結果:
この関数が結果を返すことがわかります:(「ローストチキンウィング」、「ローストナス」、「ローストコーン」)、type()関数を使用して、このデータタイプがタプルと呼ばれていることを知ることができます

リストと同様に、タプルは反復可能なオブジェクトです。つまり、forループを使用してタプルをトラバースでき、この時点でのコードは次のように記述できます。

def menu(*barbeque):
    for i in barbeque:
        print('一份烤串:' + i)

menu('烤香肠', '烤肉丸')        
menu('烤鸡翅', '烤茄子', '烤玉米')
# 不定长参数可以接收任意数量的值
一份烤串:烤香肠
一份烤串:烤肉丸
一份烤串:烤鸡翅
一份烤串:烤茄子
一份烤串:烤玉米

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

関数内で定義された変数にはローカルスコープがあり、関数外で定義された変数にはグローバルスコープがあります。

ローカル変数は、それらが宣言されている関数内でのみアクセスできますが、グローバル変数は、プログラム全体のスコープ内でアクセスできます。関数を呼び出すと、関数で宣言されているすべての変数名がスコープに追加されます。

total = 0 # 这是一个全局变量
# 可写函数说明
def sum( arg1, arg2 ):
   #返回2个参数的和."
   total = arg1 + arg2 # total在这里是局部变量.
   print("函数内是局部变量 : ", total)
   return total
 
#调用sum函数
sum( 10, 20 )
print("函数外是全局变量 : ", total)

出力結果:

函数内是局部变量 :  30
函数外是全局变量 :  0

もう一度考えます。

ああ、多機能の入れ子。
matryoshkaのように、関数内に別の関数が存在する場合があります。

実際、これは理解しやすいです。印刷について考えてください。これは単なる機能です。以前は他の機能で印刷を使用することがよくありました。


機能小さなプロジェクト

括弧なしで4つの算術演算をサポートする小さな計算機を作成します。括弧を作成するのは難しすぎます。

ここに写真の説明を挿入


物事は「クラス」によって集められます

クラスとは何ですか?オブジェクトとは何ですか?
今日の高レベルのプログラミング言語にはしきい値があります。つまり、オブジェクト指向のプログラミングである必要があり、オブジェクト指向のプログラミングでは、クラスのサポートが必要です。
では、オブジェクト指向プログラミングとは何ですか?人間などのある種の事柄の特徴と機能を説明することであり、対象は人間であり、人間の特徴と機能はこのカテゴリーで実現されなければなりません。
特徴:

没什么毛
两个肩膀扛一个脑袋
等等

スキル:

直立行走
使用火
能写字
等等

そうです、これらの特徴とスキルを組み合わせると、あなたは人間です。

オブジェクトとインスタンスの2つの概念について
説明します。オブジェクトとは何ですか?これは構築するクラスであり、構築されるモデルは何ですか。上記の人間の例を見ると、Nuwaが人をつまむときの型として理解できます。 、NuWaは「人間」の物体に面して地球を圧迫していました。
インスタンスは何ですか?それはこのクラスを通して構築され、クラスのすべての特徴と機能を備えたものは、NuWaがつまんだ実在の人々として理解することができます。

クラスの作成

ここに写真の説明を挿入

写真を見て話してください、写真は千の言葉の価値があります。

クラスのインスタンス化

ここに写真の説明を挿入

クラスコール

ここに写真の説明を挿入

ここで、ワンストップサービスを整理しましょう。
人間を作成します。彼には2本の足があり、走ったりジャンプしたりできます。書き方は?このように書いてください:

class People:
	leg = 2
	def run(self):
		print('他是一个人,他能跑')
	def jump(self):
		print('He is a man,he can jump')

lihua = People()
lihua.run()

さて、ここで私が明らかにしていないことがまだあります。ビルは「自己」について正確に何と言っていますか。

  1. 名前が示すように、自己。さて、直接使う方法を見てみましょう。
class People:
	leg = 2
	def run(self):
		print('他是一个人,他有%d条腿,所以他能跑',self.leg)
	def jump(self):
		print('He is a man,he can jump because of his %d legs',legs)

lihua = People()
lihua.run()

クラスの外部でクラス属性を呼び出す場合は、最初にインスタンスを作成してから、インスタンス名の形式で呼び出す必要があります。

したがって、クラス内でクラス属性を呼び出したい場合、インスタンスが作成される前に、データを受信するためにインスタンスを置き換える変数が必要です。この変数はパラメーターselfです。

自己の役割は、最初にインスタンスの場所を占有することと同等であり、インスタンスが作成されると、「引退して善良な人に辞任」します。

同様に、クラスメソッド内の他のメソッドを呼び出したい場合は、selfを使用してインスタンスを表す必要もあります。

  1. 初期化メソッド
    C ++にはクラスの初期化があり、Pythonクラスにもいくつかある必要があります。栗を見てみましょう:

初期化方法を定義するための形式はdefinit(self)であり、これはinitと左右の下線(「initialize」の略)で構成されます。
初期化メソッドの機能は次のとおりです。各インスタンスオブジェクトが作成されると、メソッド内のコードは呼び出さずに自動的に実行されます。

class People:
	def __init__(self):
		print('恭喜你,你造了个人')
lihua1 = People()

これはある種、別の種類です

class People:
	def __init__(self,num):
		self.num = num
	def born()
		print('恭喜你,你获得了'+self.num+'个好朋友')
lihua2 = People()
lihua2.born()

流域、難易度はさらに高い

クラスの継承

継承とは何ですか、C ++での継承はまだとても楽しいです、ちょうどあなたの父がクラスであるように、あなたはあなたの父の特徴とスキルのいくつかを継承します、あなたはあなた自身のスキルを持つこともできます、これは継承です。

ここに写真の説明を挿入

次に、上記で述べたことを実装しましょう。

class Father:
	skin = 'yellow'
	def clever():
		print('他是个聪明人')

class Son(Father):
	def strugle():
		print('他很努力')

lihua = Son()
lihua.clever()
print(lihua.skin)
lihua.strucle()

複数の継承

クラスは同時に複数のクラスを継承できます。構文はクラスA(B、C、D)です。

ここでは、自分で人を実現し、両親の利点を継承することができます。たとえば、父親は頭が良く、母親はかっこいい、かっこよくてかっこいい、やる気があります。

小さなヒント:近接性の原則:親クラスが子クラスに近いほど(つまり、左側にあるほど)、親クラスが近いほど、優先度が高くなります。サブクラスがプロパティとメソッドを呼び出すとき、サブクラスは最初に左側の親クラスを探し、次にそれが見つからない場合は右側を探します。

ここに写真の説明を挿入

もっと詳しく知る:
ここに写真の説明を挿入


親関数のオーバーライド

コードの書き換えは、サブクラスの親クラスコードを変更したものです。

単に栗を与えるだけです、実際、これはまだ非常に重要なポイントです:

class Father:
	skin = 'yellow'
	def clever():
		print('他的智商100')

class Son(Father):
	def clever():
		print('他的智商110')
	def strugle():
		print('他很努力')
lihua = Son()
lihua.clever()

実用的な小さなプロジェクト

ここで、今日学んだことを統合するために、家族の遺産の短い話を実現しましょう。

彼は特権的な家庭で生まれました。祖父は最初からガーゼ事業を始めました。祖父の世代では、事業はさらに拡大し、新しい薬局やマネーハウスが追加されました。父の世代では、日本の海賊が侵入し、状況は混乱し、人々は避難しました。それで父親は断固として小屋を開けて薬を広めることに決めました。数年の粘り強さの後、彼はついに富を失いましたが、彼らは後悔していませんでした。国はどこで壊れていますか?

彼の世代では、中国国家の大いなる若返りのスローガンに応えて、彼は彼のスキルを一生懸命練習し、いつの日か家族の栄光を再建することを楽しみにしていました...

ねえ、自分でフォローアップして、彼の祖父、彼の祖父、彼の父、そして彼の4つのカテゴリーを実装しましょう。このストーリーラインをつなぎ合わせます。

いい加減にして!

ここに写真の説明を挿入
ここに写真の説明を挿入
ここに写真の説明を挿入

継続的な更新では、必要に応じてフォローアップできます

おすすめ

転載: blog.csdn.net/qq_43762191/article/details/109067431