多くのパートナーが、私もこの方法を持ってすぐにPythonプログラミングのエントリが、我々は機械学習のPythonモデリングプロジェクトを使用する際に接触させ、そして誰もがプロジェクトファイルの管理習慣の独自のセットを持っていますが、それは一度にまとめ地雷を踏んで今ここで誰もが共有するために!私はあなたが迂回願っています!
出すためのディレクトリ
- 事前にアーカイブプロジェクトファイル
- 手動で元のデータを変更しないと、バックアップを作成しません
- 適切に構成パスを実行します。
- コードに必要なメーク注意と備考
- あなたのPythonのループコードを加速
- あなたのループのコードの進行状況を可視化
- 異常なキャプチャツールの効率的な使用
- コードの堅牢性にもっと配慮します
うまくファイリングの事前1.プロジェクト文書
私はいつもの都合だった前のコード、データは、文書が1つのフォルダに集中している一度バックプロセスは非常に苦痛、または変更されたコンピュータであるように、あなたは新しいジョブを開始するたびに、それは、めちゃくちゃに見えますファイルはすべて死ぬことを実行している、我々は非常に痛い、自分でパスを変更する必要があります。
自分自身のいくつかの探査の後、我々はおよそいくつかのサブフォルダ、あなたのメインフォルダ内のコードにプロジェクトを分割することができます。
2.手動で元のデータを変更しないと、バックアップを作成決して
私たちは、次回のバックトラッキング私たちを助けるために、ソースデータの適切なバックアップを必要とする、他のコードや他の文書にも、不慮の損失を避けるためにバックアップする必要がある、中間段階の次の操作または修正すること、およびことがあります。
こちらの記事から徐梁Linuxは、4つのツールをお勧めします:
- Gitのバージョン管理システム
- rsyncのバックアップファイル
- Dropboxのクラウドストレージ
- タイムマシンタイムマシン
はじめに、私はここでは起動しません多くのツールを使用するには、あなたは絵自体について知らせるために行くことができます。
3.適切に設定パスを行います
執筆時点で多くの学生が、ダイレクトパス、絶対パスのような通常の状況下ではないが、問題ですが、コードは他の人々が学習や問題が来たときに実行中で共有されている場合、直接実行することができない多くのケースでありますトン、
これは、することをお勧めします。
- 相対パスを使用した:スクリプトはメインディレクトリに配置され、(例えば、データ、サードパーティのパッケージなど)他のリソースここでそのような./data/processed/test1.csv同じ又は下位ディレクトリ、
- グローバルパス構成変数:
># 设置主目录
HOME_PATH = r'E:ML90615- PROJECT1'
# 读取数据
data = open(HOME_PATH+'/data/processed/test1.csv')
data = pd.read_csv(data)
data.head()
4.コードに必要なメイクの注意と備考
私はほとんどの人が信じていない、と識別することを信じますか?戻るヶ月前(備考語を行っていない場合は)どのくらい理解できるか見て、それを見るためにコードを書くために
5. Pythonのループコードを加速
这里推荐 云哥(Python与算法之美)的一篇文章:24式加速你的python
收藏起来,多看多几次,养成好习惯呗,这样子你写代码才会越来越快~
6. 可视化你的循环代码进度
这里介绍一个Python库,tqdm,先安装一下:pip install tqdm
这个是一个可以显示循环进度的库,有了它就可以更加运筹帷幄了。
大家可以看下面的例子:
7. 使用高效的异常捕获工具
异常bug定位,以前的我经常也是一条print()函数走到底,虽然说也没什么问题,但效率上还是会比较慢,后来发现了一个叫PySnooper的装饰器,仿佛发现了新大陆。
我们一般debug,都是在我们可能觉得会有问题的地方,去打印输出,看下实际输出了什么,然后思考问题所在,这需要我们去改code,非常细致地改,相比较直接加个装饰器,是十分麻烦的。
大家可以看看Example:
在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
1 import pysnooper
2 @pysnooper.snoop('./file.log')
3 def number_to_bits(number):
4 if number:
5 bits = []
6 while number:
7 number, remainder = divmod(number, 2)
8 bits.insert(0, remainder)
9 return bits
10 else:
11 return [0]
12 number_to_bits(6)
我们把函数每一步的输出都保存为file.log,我们可以直接去看到底哪里出了问题。
8. 要多考虑代码健壮性
何为代码的健壮性,顾名思义,就是可以抵挡得住各种异常场景的测试,异常处理工作由“捕获”和“抛出”两部分组成。“捕获”指的是使用 try ... except 包裹特定语句,妥当的完成错误流程处理。而恰当的使用 raise 主动“抛出”异常,更是优雅代码里必不可少的组成部分,下面总结几点供大家参考:
1)知道要传入的参数是什么,类型,个数 (异常处理,逻辑判断)
1 def add(a, b):
2 if isinstance(a, int) and isinstance(b, int):
3 return a+b
4 else:
5 return '参数类型错误'
6 print(add(1, 2))
7 print(add(1, 'a'))
2)只做最精准的异常捕获
我们有的时候想着让脚本work才是王道,所以不管三七二十一就搞一个大大的try...except把整块代码包裹起来,但这样很容易把原本该被抛出的 AttibuteError 吞噬了。从而给我们的 debug 过程增加了不必要的麻烦。
所以,我们永远只捕获那些可能会抛出异常的语句块,而且尽量只捕获精确的异常类型,而不是模糊的 Exception。
1 from requests.exceptions import RequestException
2 def save_website_title(url, filename):
3 try:
4 resp = requests.get(url)
5 except RequestException as e:
6 print(f'save failed: unable to get page content: {e}')
7 return False
8 # 这段正则操作本身就是不应该抛出异常的,所以我们没必要使用 try 语句块
9 # 假如 group 被误打成了 grop 也没关系,程序马上就会通过 AttributeError 来
10 # 告诉我们。
11 obj = re.search(r'<title>(.*)</title>', resp.text)
12 if not obj:
13 print('save failed: title tag not found in page content')
14 return False
15 title = obj.group(1)
16 try: with open(filename, 'w') as fp:
17 fp.write(title)
18 except IOError as e:
19 print(f'save failed: unable to write to file {filename}: {e}')
20 return False
21 else:
22 return True
3)异常处理不应该喧宾夺主
引くような例外にいえば正確ではなく、それぞれが非常に正確である場合には、実際に私たちは、コアコード、コード全体の読みやすさを妨げる文ブロックを除いて...しようとするコードの多くを持っています。
ここでは、ロジックが繰り返される例外処理を簡素化し、私たちの例外処理プロセスを改善するために、コンテキストマネージャを使用することができます。
1 class raise_api_error:
2 """captures specified exception and raise ApiErrorCode instead
3 :raises: AttributeError if code_name is not valid
4 """
5 def __init__(self, captures, code_name):
6 self.captures = captures
7 self.code = getattr(error_codes, code_name)
8 def __enter__(self):
9 # 该方法将在进入上下文时调用
10 return self
11 def __exit__(self, exc_type, exc_val, exc_tb):
12 # 该方法将在退出上下文时调用
13 # exc_type, exc_val, exc_tb 分别表示该上下文内抛出的
14 # 异常类型、异常值、错误栈
15 if exc_type is None:
16 return False
17 if exc_type == self.captures:
18 raise self.code from exc_val
19 return False
上記のコードでは、コンテキストを入力し、何もしないさraise_api_errorという名前のコンテキストマネージャを定義します。あなたはコンテキストを終了する。しかし、それはそう、APIErrorCode例外クラスに置き換える場合は、現在のコンテキスト型self.capturesは、例外をスローするかどうかを決定します。
次のように使用するコンテキストマネージャ後、簡潔なコードです。
1 def upload_avatar(request):
2 """用户上传新头像"""
3 with raise_api_error(KeyError, 'AVATAR_FILE_NOT_PROVIDED'):
4 avatar_file = request.FILES['avatar']
5 with raise_api_error(ResizeAvatarError, 'AVATAR_FILE_INVALID'),
6 raise_api_error(FileTooLargeError, 'AVATAR_FILE_TOO_LARGE'):
7 resized_avatar_file = resize_avatar(avatar_file)
8 with raise_api_error(Exception, 'INTERNAL_SERVER_ERROR'):
9 request.user.avatar = resized_avatar_file
10 request.user.save()
11 return HttpResponse({})
それはすべてが、この記事のために、私は、かなり良い記事がゆっくり隠蔽可能性を感じる任意の提案やコメントは、コメントエリアでの議論を共有するために歓迎されています!