前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >python小知识

python小知识

原创
作者头像
用户6841540
发布2024-10-19 11:29:16
发布2024-10-19 11:29:16
6900
代码可运行
举报
运行总次数:0
代码可运行

python切片操作

切片

list索引如下图链接

https://upload-images.jianshu.io/upload_images/14029140-3da45bbfe1029df4.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/464/format/webp

python一般切片

一个完整的切片表达式包含两个“:”,用于分隔三个参数(start_index、end_index、step)。当只有一个“:”时,默认第三个参数step=1;当一个“:”也没有时,start_index=end_index,表示切取start_index指定的那个元素。

step:正负数均可,其绝对值大小决定了切取数据时的‘‘步长”,而正负号决定了“切取方向”,正表示“从左往右”取值,负表示“从右往左”取值。当step省略时,默认为1,即从左往右以步长1取值。“切取方向非常重要!”“切取方向非常重要!”“切取方向非常重要!”,重要的事情说三遍!

start_index:表示起始索引(包含该索引对应值);该参数省略时,表示从对象“端点”开始取值,至于是从“起点”还是从“终点”开始,则由step参数的正负决定,step为正从“起点”开始,为负从“终点”开始。

end_index:表示终止索引(不包含该索引对应值);该参数省略时,表示一直取到数据“端点”,至于是到“起点”还是到“终点”,同样由step参数的正负决定,step为正时直到“终点”,为负时直到“起点”。

python命名基础

一、Python的惯用命名方法

常用的命名方法包括驼峰命名法(Camel Case)、匈牙利命名法(Hungarian Notation)、帕斯卡命名法(Pascal)、下划线命名法(Snake Case)。

根据Python之父、荷兰程序猿Guido van Rossum的建议,Python中变量的命名应当以Snake Case为主。具体命名方式大致分为以下三种。

(一)绝大多熟情况下建议使用Snake Case命名,即全部字母均小写,用下划线代替单词间的空格

具体包括:

1.模块名

public:module_name

internal:_module_name

例如,我们可以把一个模块的文件命名为my_module.py。

这里要注意,虽然有一些比较老的模块仍然用的是MyModule这种命名方法,但是现在已经不推荐这样命名了。因为,当一个模块和一个类同名的时候,我们就搞不清楚到底指的是类还是模块了。

例如,我可能会搞混,到底写的是

import StringIO

还是

from StringIO import StringIO

2.包名

Public:package_name

3.方法名

Public:method_name()

Internal:_method_name()(被保护的)

4.函数名

Public:function_name()

Internal: _function_name()

5.全局变量名/类的变量名

Public:global_var_name

Internal: _global_var_name

6.实例对象名

Public:instance_var_name

Internal: _instance_var_name(被保护的)

7.函数的参数名

Public:function_parameter_name

8.局部变量名

Public:local_var_name

(二)少部分情况下,建议使用大驼峰命名

具体包括:

1.类名

Public:ClassName

Internal: _ClassName

2.报错名

Public:ExceptionName

(三)只有一种情况下,全部字母都大写

那就是:

1.全局常量名/类的常量名

GLOBAL_CONSTANT_NAME

Internal: _GLOBAL_CONSTANT_NAME

二、应当避免的变量命名

(一)避免由单独一个字母组成的变量名

很多初学者,甚至有一些水平比较低的老师,都喜欢用a、b、c这种单个字母来给变量命名,这是不可取的。

因为这种变量名里面不包含任何信息,变量稍微多一点,程序稍微长一点,很容易就搞不清楚谁是谁、每个变量是干什么的了。

但是,要除开几个特殊的、约定俗成的情况:

1.计数器或者迭代器(例如,i、j、k、v等)

例如,

代码语言:bash
复制
for i in range(100):
    print(i)

2.字母e在作为 try/except 语句中的异常标识符的时候。

例如,下面的代码可以准确的定位错误类型与错误明细:

代码语言:bash
复制
a = [1,2,3]
 
try:
    a[3]
except Exception as e:  # 注意e在这里的用法
    print('错误类型是',e.__class__.__name__)
    print('错误明细是',e)

3.字母f在with语句中作为文件句柄的时候

例如,如果我们要读取一个文件:

代码语言:bash
复制
with open('/path/to/file', 'r') as f:
    print(f.read())

for line in f.readlines():
    print(line.strip()) # 把末尾的'\n'删掉

现在我们知道了,用单个字母做变量名肯定是不行的。那一个变量的名字要取得多详细才合适呢?

通常来说,一个变量名的详细程度应当与这个变量在程序中出现的范围成正比。

例如,如果我们整个程序总共就不到10行代码,那么,我们用i来给一个变量命名是完全OK的。而且,此时通常就用一个单词做一个变量名。如果在这么短的程序中,每个变量都像this_is_a_variable_name一样,这么长,反而会显得很不协调、很奇怪。

如果我们的程序存在比较复杂的嵌套关系,而且一个变量在总共大几百行代码中的多个位置均有出现,那么我们就不能用i来给一个变量命名了,这是我们就要让这个变量的名字包含足够多的信息,我们才能有效地知道,它是谁,从哪儿来,到哪儿去,要干什么。

(二)避免在任何包名或者模块名中使用中划线(-)。

(三)避免在一个变量的开头和结尾加双下划线

例如:this_name

因为这种类型的变量名是由Python所保留的,用户不能自己定义这种变量名。

(四)不要存在冒犯性的词汇

否则会引起阅读代码的人的不适。如果是开源的代码,那么在代码传播的时候,会存在不好的影响。如果你是为商业公司写代码,那么你有可能影响你的前途,或者商业公司的声誉。

(五)不必要地把变量类型加入到变量名中

例如,id_to_name_dict,就是不合适的命名方法。

我们要知道,Python是动态类型语言。

三、文件名中的下划线

(一)

Internal意味着在一个模块的内部,或者是在类中被保护的或者是私有的。

(二)

在变量名前加单个下划线 (_) 可以保护模块中的变量和函数,因为linters会标记受保护的成员权限。

这个符号达到的效果是,只有类对象和子类对象自己能访问到这些变量,且不能用'from module import'导入函数。

(三)

在实例变量或方法前添加双下划线(即__,又名“dunder”),可以有效地使变量或方法成为它所属的类的私有变量或者私有方法(通过使用name mangling)。

它的效果是只有类对象自己能访问,连子类对象也不能访问到这个数据。

但是,我们不鼓励在变量或者方法前加双下划线,因为它会影响可读性和可测试性,而且并不能做到真正私有。

(四)

下划线也可能出现在以test开头的unittest method的名称中,用以分隔这个名称中的各个逻辑组件,即使这些组件本身使用了类似于CapWords的命名方法。

例如,test<MethodUnderTest>_<state>就是一个可行的命名样式。

例如,testPopEmptyStack就是根据上面的样式,命名出的一个可接受的名称。它以test开头,Pop和EmptyStack是两个逻辑组件,他们本身都是CapWorks式的命名方法,但是两个组件之间仍然用分隔开。

我们要注意,命名test methods是没有唯一的正确方法的。

四、其他注意事项

(一)谨慎地使用缩写

此外,我们还要注意,函数名(function name)、变量名、文件名应当是描述性的,要尽量避免缩写。

不过,少数几个常见的、公认的缩写,我们是可以直接使用的:

temp-->tmp

flag-->flg

statistic-->stat

increment-->inc

message-->msg

特别地,不要使用有歧义的缩写或者是你的项目以外的人不熟悉的缩写,同时也不要简单地通过删除一个单词中的字母来创造缩写。

有歧义,一般就指的是一种缩写可能对应多个单词。

另外我还见过一种奇葩的歧义,在这里分享一下,供大家一笑。

我一个学长在做teaching fellow的时候,曾经收到学生交的作业,这个学生在给作业文件命名的时候,把assignment简写成ass。因此,ta的作业下载下来全是,xxx_ass1.py、xxx_ass2.pdf、xxx_ass3.jpg,其中xxx是一个人名(逃

所以,这也是我们要谨慎使用缩写的原因。

(二)

我们应将所有相关的类和最高层级函数放在一个模块中。这一点和Java不一样,Python程序的一个模块中可以有多个类,而不是一个模块中仅能有一个类。

(三)

对于包含大量数学计算的代码,我们通常倾向于使用一些较短的、在参考文献或算法中已经建立、并惯用的符号表示来命名,尽管这些变量名通常会违本文的Python样式指南。

在定义这些变量名的时候,我们要在注释或文档字符串(docstring)中引用所有命名约定的来源。

如果命名约定的来源不可访问了,那么我们要清晰地记录下命名约定的内容具体是什么。

(四)

对于公共的API,我们更倾向于使用符合PEP8的descriptive_names,在脱离代码的上下文语境的时候,这个更有用。

(五)

在创建python脚本的时候,我们要永远使用.py作为文件名扩展。

永远不要在文件名中使用中划线(-)。

如果我们想要在没有文件扩展名的情况下去访问可执行文件,那么需要使用symbolic link或包含 exec "$0.py" "$@" 的简单bash包装器。

生成requirements.txt

会将当前环境下所有包都生成

代码语言:bash
复制
pip freeze > requirements.txt

生成当前项目下的包(推荐)

代码语言:bash
复制
# 安装
pip install pipreqs

# 在当前目录生成
pipreqs . --encoding=utf8 --force

使用requirements.txt安装依赖的方式:

代码语言:bash
复制
pip install -r requirements.txt

解决同名文件覆盖问题

Python如何避免文件同名产生覆盖

在一些不多的数据下载和生成的时候,我们倾向于直接保存为文件,当我们修改某些参数后再一次运行时,之前运行时生成的文件就被覆盖了。为了解决这个问题,这里提供几个解决方案。

  1. 判断文件是否存在;
  2. 判断是否带有”0)“这种数字带括号的格式;
  3. 文件名添加”(0), (1), (2)….“之类的编号。

以下是代码:

代码语言:python
代码运行次数:0
复制
import os
import re
 
 
def auto_save_file(path):
  directory, file_name = os.path.split(path)
  while os.path.isfile(path):
    pattern = '(\d+)\)\.'
    if re.search(pattern, file_name) is None:
      file_name = file_name.replace('.', '(0).')
    else:
      current_number = int(re.findall(pattern, file_name)[-1])
      new_number = current_number + 1
      file_name = file_name.replace(f'({current_number}).', f'({new_number}).')
    path = os.path.join(directory + os.sep + file_name)
  return path

如果使用如下创建文件的代码测试:

代码语言:python
代码运行次数:0
复制
path = r'D:\test.txt'
for i in range(10):
  with open(auto_save_file(path), 'w') as f:
    f.write('This is a test!')

Python 字符分割时,只分割最后一个(rsplit的使用)

Python 字符分割时,只分割最后一个(rsplit的使用)

在python分割时,有时候不是把整个字符分割,而是只分割部分,例如:我要分割文件路径,只想把最后的文件名去除,保留文件夹的路径。例如:/home/username/data/text.txt 我想要得到/home/username/data/。如果用split则会把整个分割成一个list,但是可以使用rsplit。

例如:

代码语言:bash
复制
path = /home/username/data/text.txt 

path.split("/")

["home","username","data","text.txt "]

而使用rsplit:

代码语言:bash
复制
path.rsplit("/",1)

["/home/username/data","text.txt "]

rsplit("/",1) 中的1,表示从后面分割1个出来,如果是2,那么就是分割两部分出来

list()与tolist()区别

list() 是把np数组的元素按照原来的格式转为列表, 生成列表的元素格式 还是np.array.而tolist()是把数组中的值作为列表元素, 生成列表与原数组结构相同。生成的列表中的元素不是数组nadarry

当需要把一个数组保留两位小数并转换为列表时:

代码语言:python
代码运行次数:0
复制
# Y时数组
Y1 = Y.tolist()
Y2 = np.array(Y1)
Y3 = np.round(Y2,2)
Y4 = list(Y3)

如果直接保留两位小数再用list()或者tolist()会有问题。

conda基本指令

conda指令

1.conda介绍

Conda 是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换。 Conda 是为 Python 程序创建的,适用于 Linux,OS X 和Windows,也可以打包和分发其他软件。用conda创建不同虚拟环境,方便快速。

2.常见命令

安装命令(以gatk为例):

代码语言:bash
复制
 conda install gatk

安装某些包时可能会安装失败,比如出现以下的错误

卸载指定软件:

代码语言:bash
复制
conda remove gatk

创建conda环境(常用步骤,强烈推荐)

代码语言:bash
复制
conda env list
# 这是我相当常用的一条命令了,建议记一记
代码语言:bash
复制
conda create -n python2 python=2
# -n: 设置新的环境的名字
# python=2 指定新环境的python的版本,非必须参数
# 这里也可以用一个-y参数,可以直接跳过安装的确认过程。

激活虚拟环境

代码语言:bash
复制
conda activate your_env_name(虚拟环境名称)

删除环境

代码语言:bash
复制
conda remove -n myenv --all

有的时候在默认的channel中没有要的包

解决:使用以下命令查找我们想要安装的包
代码语言:bash
复制
anaconda search -t conda folium

使用show指令来查看该包的详细情况

代码语言:bash
复制
anaconda show conda-forge/folium

终端会显示这个包的具体channel。

3、按照终端显示的channel,输入命令等待安装

代码语言:bash
复制
conda install --channel https://conda.anaconda.org/conda-forge folium

若还是无法解决,建议用pip安装

更多的命令可以参考这篇文章

pprint

pprint的英文全称Data pretty printer,顾名思义就是让显示结果更加直观漂亮。

print()和pprint()都是python的打印模块,功能基本一样,唯一的区别就是pprint()模块打印出来的数据结构更加完整,每行为一个数据结构,更加方便阅读打印输出结果。特别是对于特别长的数据打印,print()输出结果都在一行,不方便查看,而pprint()采用分行打印输出,所以对于数据结构比较复杂、数据长度较长的数据,适合采用pprint()打印方式。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • python切片操作
  • 切片
    • python一般切片
  • python命名基础
  • 生成requirements.txt
    • 会将当前环境下所有包都生成
    • 生成当前项目下的包(推荐)
    • 使用requirements.txt安装依赖的方式:
  • 解决同名文件覆盖问题
  • Python 字符分割时,只分割最后一个(rsplit的使用)
    • Python 字符分割时,只分割最后一个(rsplit的使用)
    • 而使用rsplit:
  • list()与tolist()区别
  • conda基本指令
    • 1.conda介绍
    • 2.常见命令
      • 安装命令(以gatk为例):
      • 卸载指定软件:
      • 创建conda环境(常用步骤,强烈推荐)
      • 激活虚拟环境
      • 删除环境
      • 有的时候在默认的channel中没有要的包
  • pprint
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档