まず、この質問自体が見当違いです。
英語やスペイン語のような文法とPythonの文法は別物です。理屈とかありません。
その言語の開発者がそうと決めたからそうなのです。
そもそもプログラミングっていうのは「機械に命令すること」です。もっと言えば「”””私たち人間が手作業でやっている処理を機械に肩代わりしてもらうために命令すること””」です。
ただ、機械は機械語と呼ばれる0と1からなる言語しか認識できません。
110111111100000001101010101010010101… のようなものです。人間にとっては読みづらく書きづらい。
そのため、人間の言語(英語とか)に近い言語としてアセンブラが開発されました。ですが同じ処理を毎回書くのが面倒。そのため、C言語のような、for文やらif文やらの構造や関数のようなもmのを使って組みやすくしたのです。でもまだ問題があったのでC++のようなオブジェクト指向を取り入れた言語が開発されて…のように人間にとって指示しやすくしていったのです。
そして、なぜ a = f(a)
のようにしたら関数になるのかとかは「開発者がそう決めたから」です。慣習的なものを理由としていることもありますが、基本的には開発者の気分次第。
ただ、関数呼び出しなのかリストにアクセスしているのかとかのようなものの区別がつけられないと厳しい時もあるので区別をつけるために「この記号はこういう意味とするぞ」と定義しているだけです。
つまり、基本的に「こういうものだ」と覚えて仕舞えばいいです。単にfor文はいつ使って…とか概念的なものを理解して書き方を学べばいいだけです。
for文とwhile文の使い分けは入門書や入門サイトに載っています。わかりづらいと言われているC言語の入門書にすら載っているのですからPythonなんて調べればわかるはずです。
[追記1]
他の方の回答を読んでちょっと思ったので追記します。
他の方が「関数名は動詞の現在形が多い, 命令形が多い」的な書き方をなさっていますが、慣習的なものだと思います。
私の上の回答で「プログラミングとは機械に命令する事」と書いています。その名残で、「このファイルに○○と書き込め」と命令形になっています。
ただし、C言語のstrstr関数( 文字列1 に 文字列2 が含まれているならその文字列データを返す…関数 ) のように名詞で構成されているような場合もありますが、大多数が命令形動詞です。
ただ、オブジェクトが持つメソッドとして「○○という状態か」とかだと Is~ になっていることが多いですが。
極論すれば 関数名を f とか a とかみたいなものでもいいです。ただしプログラミングって書いて終わり…ではなく保守も行います。
たとえば自分用のソフトを作る場合でも「やっぱりこの機能、いらねーわ」とか「あー、こういう機能を付けた方が使いやすいかも」と思って機能を追加したり削除したりとかを行います。ましてや仕事でやるならクライアントが「やっぱこの機能いらねーわ」と言ってきたりするようです。
その場合で関数名がfだのaだののような適当な名前だと可読性が悪すぎます。保守するときが大変。なので出来る限り読んでわかるような名前にします。
ファイルに書き込む処理なら Write(書き込め) File( ファイルに ) から WriteFile関数とするとか。
で、絶対的な決まりというわけではないですがコーディング規約と呼ばれるルールが存在します。言語やチームによって細かい事が変わってきますが、ここみたいな感じでやります。
ちなみにPythonに限らず、ほとんどの入門書(サイトも含めて)にあるのはあくまで「道具の使い方」だけです。
Pythonという道具の使い方だけです。C言語ならC言語という道具の使い方。
家を建てるとかDIYをするとかみたいな感じの時に建て方の理論を理解していても道具の使い方がわかっていないとできないはずです。
かといって道具の使い方が分かっていても理論が分かっていないとできませんよね。
それと一緒で、入門書に載っている内容プラス、データ構造とアルゴリズム、(オブジェクト指向を取り入れている言語なら)デザインパターン、プログラミングの基本的な考え方を理解していないと厳しいです。(入門書以外の)前半二つは知らなくても組むことはできますが知らないと使えない人が多いです。