python基础(三)

2023-11-07

模块相关基础
1.1模块的格式:
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
'这是一个注释'
__author__='lnssm'
import sys
def test():
	args=sys.argv
	if len(args)==1:
		print('hello world')
	elif len(args)==2:
		print('hello %s'%args[1])
	else:
		print('to many argument!')
if __name__='__main__':
	test()

解释:

  • 第一行和第二行是标准注释,第一行注释可以让这个文件直接在unix/linux/mac上运行,第二行是说明使用utf-8编码

  • 第三行是一个字符串,表示模块的注释,任何模块代码的第一个字符串出现都被当作是模块的文档注释

  • 第4行使用__author__变量,把作者写进去,注意这是两个划线

  • 第5行是引入模块,导入sys模块后,我们就有了变量sys指向该模块,利用sys这个变量,就可以访问sys模块的所有功能。sys模块有一个argv变量,用list存储了命令行的所有参数。argv至少有一个元素,因为第一个参数永远是该.py文件的名称,例如:

    运行python3 hello.py获得的sys.argv就是['hello.py']

    运行python3 hello.py Michael获得的sys.argv就是['hello.py', 'Michael]

  • 第6行是真正的写的功能

    注意下

    if __name__='__main__':
    	test()
    

    虽然php没有相应的入口函数,但是像c,java,go等都有入口函数main,你就可以把它作为是,就行了,引申一下就是,就我们在命令行执行这个模块文件时,python解释器把一个特殊变量__name__置为__main__

1.2 作用域

在一个模块中,我们可以定义多个变量与函数,但有些函数或变量,只是为这个模块自己使用的,不想让别的模块调用,这个时候作用域就出现了

格式:使用_变量或者__函数来表示,相当于一个private函数或者变量了,但是在python中,没有绝对的private变量,也就是说你用了也不会有什么错,只是我们不用罢了

def _private_1(name):
	return 'hello %s'%name
def _private_2(name):
	return 'hello %s'%name

2.1 安装第三方库

a.在python中使用pip包管理工具进行操作

第三方库资源官网:pypi.python.org

pip使用:

>>> pip help #查看帮助信息
>>> pip install 包名  安装包
>>> pip uninstall 包名   卸载包

还可以安装 anaconda官网提供的gui安装包,常用的包都在里面

b. 模块搜索路径

默认情况下,python解释器会搜索当前目录,所有已安装的内置模块和第三方模块,搜索路径都会放在sys模块中path变量中

>>> import sys
>>> sys.path

如果我们要添加自己的搜索目录,有两种方法

  • 直接修改sys.path

    >>> import sys
    >>> sys.path.append('/usrs/my_py_scripts')
    
  • 设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响。

2. 面向对象编程(oop)
2.1 类和实例:
  • 定义:它和php也差不多,定义类通过class关键字,它们也有封装,继承,多态三大特型
#定义一个类
class Student(object):
	

class后面紧接着是类名,类名通常是大写开头的单词,紧接着是(object) 表示该类是从哪个类继承过来的

  • 实例: 通过类名+()的形式来实现
>>> student=Student()
  • 如果在创建类的时候初始化参数,python提供了一个__init__(self,name,age)php中的__construct()功能差不多,都是初始化一些数据的

    class Student(object):
    	def __init__(self,name,age):
    		self:name=name
    		self:age=age
    

    __init__()的第一个参数永远是self,表示创建的实例本身,当然这个值不用传

2.1 访问限制,

如何实现在class内部,属性和方法,不能通过外部调用直接赋值呢?

可以在方法或者属性前面添加__

class Student(object):
	def __init__(self,name,age):
		self.__name=name
		self.__age=age

这样在外面就不可以访问了,如果想修改里面的值可以这样来操作

class Student(object):
    def __init__(self,name,age):
        self.__name=name
        self.__age=age

    def get_name(self):
        return self.__name
    def set_name(self,name):
        self.__name=name

小demo:

class Student:
    def __init__(self,name,gender):
        self.name=name
        self.__gender=gender
    def get_gender(self):
        return self.__gender
    def set_gender(self,name):
        self.__gender=name
# 测试:
bart = Student('Bart', 'male')
if bart.get_gender() != 'male':
    print('测试失败!')
else:
    bart.set_gender('female')
    if bart.get_gender() != 'female':
        print('测试失败!')
    else:
        print('测试成功!')
3.获取对象
3.1
  • 方法: 可以使用type()函数来判断基本类型,如果要判断一个对象是否是函数,则需要使用types模块中定义的常量,来判断了
>>> import types
>>> def fn():
	pass
>>>type(fn)=types.FunctionType
>>> True
  • 还可以使用`isinstance()来判断class 的类型
如果是继承的关系
object->animal->dog->hushky
>>> a=Animal()
>>>b=Dog()
>>> c=Hushky()
>>> isinstance(h,hushky)
>>> True
>>> isinstance(c,Dog)
>>> True   #这是因为hushk是从dog上面继承下来的,也属性dog的一部分
  • 还可以判断一个变量是不是某些类型中的一种,

    >>> isinstance([1,2,3],(list,tuple)) 判断是否是list或tu
    
    
3.2 获取对象里的所在属性和方法

dir()函数:可以使用dir()函数,它返回一个包含字符串的list

getattr()函数:获得一个对象的属性

setattr()函数;设置一个对象的属性

hasattr()函数:判断一个对象的属性是否存在,如果是私有属性可返回false

3.3 __slots__属性

说明:创建实例时,能限制该实例能添加的属性,只在当前类有效,在继承类里使用无效,如果子类里想使用,则需要在子类里定义__slots__,才可以.

小demo:

#定义一个Student类
class Student:
	__slots__=('name','age')
	
>>> s=Student()
>>> s.name=lnssm
>>> s.age=18
>>> s.sex=u  # 这是报错了
3.4 @property属性

验证参数是否符合预期,当我们想为一个属性赋值时,需要进行判断合法性,需要使用@property这个属性来实现

class Student(object):
	@property
	def score(self):
		return self._score
	@score.setter
	def score(self,value):
		if not isinstance(value,int):
			raise ValueError('score must is integer)
		if value<0 or value>100
			raise ValueError('score must 0~100)
		self._score=value

@property的实现比较复杂,我们先考察如何使用。把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,注意到这个神奇的@property,我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的

还可以定义一个只读属性,方法是只定义一个getter方法,而不定义一个setter方法

class Student(object):
	@property
	def birth(self):
		return self._brith
	@birth.setter
	def birth(self,value):
		self._brith=value
	@property
	def age(self):
		return 2019-self._brith

请利用@property给一个Screen对象加上widthheight属性,以及一个只读属性resolution

class Screen(object):
    @property
    def width(self):
        return self._width
    @width.setter
    def width(self,value):
        self._width=value
    @property
    def height(self):
        return self._height
    @height.setter
    def height(self,value):
        self._height=value
    @property
    def resolution(self):
        return self._height* self._width

# 测试:
s = Screen()
s.width = 1024
s.height = 768
print('resolution =', s.resolution)
if s.resolution == 786432:
    print('测试通过!')
else:
    print('测试失败!')
4. python是支持多继承的,php 是单继承的

在设计类的继承关系时,通常,主线都是单一继承下来的,例如,Ostrich继承自Bird。但是,如果需要“混入”额外的功能,通过多重继承就可以实现,比如,让Ostrich除了继承自Bird外,再同时继承Runnable。这种设计通常称之为MixIn

5.定制类
5.1 __str__:可以使用打印信息美化,类似于es或mongo里的pretty功能
class Student(object):
	def __init__(self,name):
		self.name=name
	def __str__(self):
		return 'Stuent object (name:%s)' % self.name
5.2 __iter__该方法返回一个迭代对象,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。
class Fib(object):
	def __init__(self):
		self.a,self.b=0,1
	def __iter__(self):
		return self
	def __next__(self):
		self.a,self.b=self.b,self.a+self.b
		if self.a>10000:
			rasie StopIteration()
		return self.a
5.3 __getitem__实现这个方法可以实现通过下标取出元素
class Student(object):
	def __getitem(self,n):
		a,b=1,1
		for x in range(n):
			a,b=b,a+b
		return a
5.4 __getattr__调用不存在的方法或属性时,会触发
class Student(object):
	def __init__(self):
		self.name='lnssm'
	def __getattr__(self,attr):
		if attr=='score':
			return 999;
5.5 __call__ 以访问方法的方式去调用对象
class Student(object):
	def __init__(self,name):
		self.name=name
	def __call__(self):
		pritf('this is %s' % self.name)
#调用方法如下
>>> s=Student('lnssm')
>>>s()

可以使用callable()函数可以判断一个对象是否是可调用对象

6.异常处理
6.1 捕获异常

python中可以使用try...expect...finally来处理,python错误其实也是一个class ,所有的错误类型都继承自BaseException

try:
    print('try...')
    r = 10 / 0
    print('result:', r)
except ZeroDivisionError as e:
    print('except:', e)
finally:
    print('finally...')
print('END')
6.2 记录错误

python内置的logging模块可以非常容易的地记录错误信息

import logging

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    try:
        bar('0')
    except Exception as e:
        logging.exception(e)

main()
print('END')

6.3 抛出异常

使用raise语句

# err_raise.py
class FooError(ValueError):
    pass

def foo(s):
    n = int(s)
    if n==0:
        raise FooError('invalid value: %s' % s)
    return 10 / n

foo('0')
7.调式
7.1 方式
  • print()

  • assert()断言

    def foo(s):
    	n=int(s)
    	assert n!=0,'n is zero' 相当于三元运算吧,断言`n !=0`为True,否则输出后面的语句
    
  • logging模块,

    improt logging
    logging.basicConfig(level=logging.INFO) #这是设置记录信息的级别,有`debug`,`info`,`warning`,`error`
    
    
  • pdb启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。我们先准备好程序:

  • pdb.set_trace() 这个方法也是用pdb,但是不需要单步执行,我们只需要import pdb,然后,在可能出错的地方放一个pdb.set_trace(),就可以设置一个断点:

    # err.py
    import pdb
    
    s = '0'
    n = int(s)
    pdb.set_trace() # 运行到这里会自动暂停
    print(10 / n)
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python基础(三) 的相关文章

  • 如何从Python请求库正确返回http响应(想要一个Python反向代理)

    这个问题继续自here https stackoverflow com questions 48635552 how to programmatically communicate with apache 我想创建一个反向代理 它允许我托管
  • 安装 Pillow 和 PIL

    I have Ubuntu 12 04 http en wikipedia org wiki List of Ubuntu releases Ubuntu 12 04 LTS 28Precise Pangolin 29 Precise Pa
  • Pandas 中的索引如何工作?

    我是Python新手 这似乎是一个需要问的基本问题 但我真的很想了解这里发生了什么 import numpy as np import pandas as pd tempdata np random random 5 myseries on
  • 如何配置 VS Code 以便能够单步执行调试 Python 脚本时加载的共享库 (.so)?

    从命令行使用 gdb 我可以在加载共享库时中断 知道我有共享库的源代码 如何在 VS Code 中获得相同的行为 对我来说 它以某种方式起作用 这是我的设置 Ubuntu 18 04 调试我从 Python3 加载的 C 共享库 更具体地说
  • 将 for 循环转换为列表理解

    我有一个for循环 将字符串列表中每个元素的子字符串与另一个字符串列表中的元素进行比较 mylist for x in list1 mat False for y in list2 if x 14 in y mat True if not
  • 意外的缩进错误,但缩进看起来正确

    我一直在尝试运行此代码 但它引发了缩进错误 无论我尝试什么 结果都是一样的 如果我删除之前的缩进def str self 和代码的其余部分 它工作正常 但在输出时 它不显示问题 而是显示 问题对象 def str self Indentat
  • 如何在Python中绘制“Trace Explorer”?

    我需要重新创建一个情节 踪迹浏览器 https www bupar net trace explorer html与下面在 R 中创建的类似 我希望使用 matplotlib 但找不到任何有关如何执行这样的跟踪资源管理器的示例或参考 有人能
  • Panda如何将行分组到不同的时间桶中?

    我有一个带有名为时间戳的日期时间类型列的数据帧 我想根据时间部分的时间戳将数据帧拆分为多个数据帧 每个数据帧包含按其值模 x 分钟进行值的行 其中 x 是变量 请注意e and f不按原来的顺序 以 10 分钟为模 我希望所有时间都以3在一
  • 将 *.appspot.com 重定向到自定义域:Google 应用引擎 (Django)

    我直接将我的一些示例代码放在这里以获得更好的了解 url py r robots txt myapp views robots r myapp views home views py def home request my code ret
  • 访问具有动态名称的变量的值

    我发现了几个主题 其中讨论了在循环中动态创建单个变量是不好的做法 最好使用字典 就我而言 我不需要动态创建它们 我想要access他们在循环中 我不想用字典对于他们来说 因为这些变量在代码中的很多地方使用 并且只有一个地方我需要这种动态访问
  • 确定 TCP Listen() 队列中当前积压的连接数

    有没有办法找出currentLinux 上 TCP 套接字上等待 Accept 的连接尝试次数 我想我可以在每个事件循环上点击 EWOULDBLOCK 之前计算成功的 Accept 数量 但我使用的是隐藏这些细节的高级库 Python Tw
  • 使用 Python 访问 MP3 音乐数据

    我正在尝试编写一个 Python 脚本 用于使用歌曲的数据作为比较的基础来搜索重复的 mp3 4 文件 我的情况涉及许多文件名相似但 ID3 标签不同的 mp3 4 文件 起初 我尝试循环并使用 md5 来查找重复文件 忽略文件名 当然 当
  • 如何将字符串转换为二进制?

    我需要一种方法来获取 python 中字符串的二进制表示形式 例如 st hello world toBinary st 是否有一个模块可以以某种巧妙的方式执行此操作 像这样的东西吗 gt gt gt st hello world gt g
  • PyCrypto:生成受 DES3 密码保护的 RSA 密钥

    我已经能够使用 DES3 创建受密码保护的 RSA 密钥 嗯 I think因为我对这个加密世界非常陌生 使用以下命令 openssl genrsa out tmp myKey pem passout pass f00bar des3 20
  • 如何为 matplotlib 中已绘制的线设置标签?

    在我的代码中我已经执行了 ax plot x y b 并且需要能够在事后设置相应行的标签 以达到与我相同的效果 ax plot x y b label lbl 有没有办法在 Matplotlib 中做到这一点 如果你抓住了line2D创建对
  • 将2个暗淡数组“列表列表”输出到python中的文本文件

    简单的问题 我正在创建一个两个暗淡的数组 ddist 0 d for in 0 d 在下面的代码中使用列表 它使用 gis 数据输出距离 我只是想要一种简单的方法来获取数组 列表的结果并将其输出到保持相同的 N N 结构的文本文件 我过去曾
  • 合法 .xlsx 文件上的 openpyxl load_workbook() 会导致 zipfile.BadZipFile 错误

    我试图做的是将数据帧数据附加到现有的合法 Excel 文件中 我使用了 openpyxl 中的 load workbook 函数 但它系统地返回错误 这是一些在我的机器上崩溃的代码 from openpyxl import load wor
  • 从 Keras 检查点加载

    我正在 Keras 中训练一个模型 我使用以下代码保存了所有内容 filepath project model hdh5 checkpoint ModelCheckpoint project model hdf5 monitor loss
  • Django ALLOWED_HOSTS 与 CORS(django-cors-headers)

    ALLOWED HOSTS 和 CORS 之间有什么区别 如果我定义了 ALLOWED HOSTS 我还需要定义 CORS 吗 我没有使用 django 模板 我也有可能动态定义这两个吗 我认为没有 我使用 django 作为后端 并在不同
  • python函数中的Return语句不返回任何内容[重复]

    这个问题在这里已经有答案了 我不明白退货和打印之间的区别 有人告诉我应该在函数语句中使用 return 但它不会返回任何内容 所以我一直在函数中使用 print 但我想了解为什么我的函数中的 return 语句不起作用 def triang

随机推荐

  • matplotlib绘制柱状图(普通、堆叠、左右分布)

    文章目录 1 堆叠图 2 左右图 示例代码 3 堆叠 左右 示例代码 不论是堆叠 还是左右分布 其实他们都是柱状图bar 只是根据参数的不同 有不同的显示位置 多个bar呈现在一起就看上去像是堆叠起来 或是左右分布了 因此只需要控制bar的
  • Python3学习(七):模块

    Python3 模块 把一些可以反复使用的代码存放在文件中 为一些脚本或者交互式的解释器实例使用 这个文件被称为模块 模块是一个包含所有你定义的函数和变量的文件 其后缀名是 py 模块可以被别的程序引入 以使用该模块中的函数等功能 类似于C
  • JVM 如何自动完成垃圾回收

    一 简介 思考一个问题 在 java 里面我们 new 一个对象 等到程序结束后 这个对象就被自动回收了 完成这项工作只需要确定 哪些内存需要回收 什么时候回收 如何回收 接下来我们详细的解释下这三个问题 二 哪些内存需要回收 由于程序计数
  • 判断大小端存储两种办法

    1 强制转换 给定 int类型的变量a 赋值为1 1的16进制为 00 00 00 01 若小端存储则a中存储为 01 00 00 00 大端存储为 00 00 00 01 则可以取出a的地址强转为char 类型 char a来判断值为0
  • 2023最新最全git安装教程,保姆级手把手式安装!!!

    目录 一 git简介 二 安装过程 1 首先进入git的官网 https git scm com 然后选择Downloads 2 接着选择与自己电脑系统对应的下载选项 我的电脑是windows7的系统 因此选择windows 3 进去之后
  • [导入]TOMPDA WAP新闻订阅教程

    要浏览本条信息请点击文章标题 文章来源 http www wapkf com article other wap 2006 20060511241 html 转载于 https www cnblogs com 200831856 artic
  • 有哪些值得推荐的好用视频剪辑软件?

    首先 我们不管是工作需要 还是做自媒体 一款用着顺手的视频剪辑软件必不可少 经常看到很多人说我是小白 但又想学习视频剪辑 该如何选择适合自己的视频剪辑软件呢 看到抖音 小红书里面很多有意思的视频 自己也想剪辑试试 但又不知从何下手 话不多说
  • HuggingFace——Accelerate的使用

    Overview Accelerate is a library that enables the same PyTorch code to be run across any distributed configuration by ad
  • 20171207编写一个程序,只接受正整数的输入,然后显示所有小于或等于该数的素数。

    素数 在大于1的整数中 只能被1和这个数本身整除的数 思路 用一个标志sign 来标记出素数 include
  • flink学习40:tableAPI的扫描、投影、过滤、列操作

    from用法 select用法 as用法 where用法 filter用法 列操作 增 删 改
  • 【单例模式】

    单例模式 单例模式常见的几种方法 饿汉式 懒汉式DCL 懒汉式内部类 单例模式常见的几种方法 饿汉式 饿汉式 private final static SingletonPattern singletonPattern new Single
  • centos7 升级openssl1.1.1g、openssh8.6p1小记

    系统版本 CentOS Linux release 7 6 1810 Core 默认版本 OpenSSH 7 4p1 OpenSSL 1 0 2k fips 升级版本 OpenSSH 8 6p1 OpenSSL 1 1 1g 1 安装步骤
  • windows10中安装ubuntu双系统时出现unable to find a medium containing a live file system解决办法

    在ubuntu官网上下载最新的18 04 1LTS版本 通过rufus软件将其写入U盘中 但在电脑安装时出现如下错误 经搜索得到如下信息 原贴链接 只需在安装进行到如下界面时 拔掉U盘再插上即可解决问题
  • 我使用OpenCvSharp的一些坑,我的使用心得

    首先是关于 copyto 的操作郁闷 资源图片 需要 是正方形 或者 宽 大于高经我测试 长宽 大小的情况 还是需要跟背景有相应的一致性 比如如果背景 是长大于宽 则资源文件 也需要长大于宽 反之亦然 正方形的图片 则无此要求 要比背景图片
  • Mybatis高级映射

    Mybatis高级映射本质上来说是多个表的联合查询过程 订单数据模型分析思路 数据表 用户表user 记录了购买商品的用户信息 订单表orders 记录了用户创建的订单 购买商品的订单 订单明细表orderdatail 记录了订单的详细信息
  • 玩转Netty,从“Hello World”开始

    大家好 我是老三 之前里 我们讨论了Java的三种IO模型 提到了网络通信框架Netty 它简化和优化了NIO的使用 这期 我们正式开始走近Netty 为什么要用Netty 首先当然是NIO的使用 本身比较复杂 而且还存在一些问题 除此之外
  • Ubuntu 软件包管理详解

    Ubuntu 软件包管理详解 Ubuntu 方便宜用 最值得让人称道的便是其安装软件的方式 一条命令 sudo apt get install xxx 就几乎能帮你搞定所有的软件安装难题 但是有时你可能有这样的需求 查看某个软件包是否安装
  • 使用Object.setPrototypeOf()设置对象的原型

    此方法可以设置对象的原型 Object setPrototypeOf方法是针对对象实例的 而不是构造函数 类 此方法修改的是对象实例的内部属性 prototype 也就是 proto 属性所指向的对象 它只是修改了特定对象上的原型对象 对于
  • Unity中,实现鼠标点击物体,触发事件

    对于UI 很容易能够实现鼠标点击 从而触发事件 但是对于游戏中的物体 则需要多进行一些操作 原理很简单 就是由鼠标点击处发射线 与游戏物体发生碰撞 碰撞到的物体 就是你点击到的物体 具体操作如下 对你的Camera 摄像机 添加 Physi
  • python基础(三)

    模块相关基础 1 1模块的格式 usr bin env python3 coding utf 8 这是一个注释 author lnssm import sys def test args sys argv if len args 1 pri