主として伝統的なプログラミング言語では、変数の宣言位置が決められているものが多いです。
Pythonでは、変数宣言という概念がないので、宣言せずに(=宣言できないので)必要なところで代入します。
Cでも、昔から関数の先頭以外でも宣言できました。ただし、ブロックの先頭({の後で実行文の前)です。他の回答にあるように、最近のC規格ではブロックの先頭以外でも宣言できるようになりました。
以上が文法の話です。
C言語を利用していた際に、使用する変数は全て各関数の冒頭に定義しろと教わったのですが
型宣言のある言語では、コーディングルールとして「関数やメソッドの先頭で宣言する」というルールを定めるのは、ありだと思います。「この変数の型は何だっけ?」というときにどこを見れば良いか明確なので。ただし、IDEを使っているとIDEが支援してくれるはずなので、現状では、特に必要の無い理由でしょう。「最初に必要になったところで宣言する」というルールで十分だと思います。
よく似た名前の変数が複数あるときは、「似たものは全部でこれだけあるよ」という意味でまとめて宣言した方が良いような気はします。