注意事项+对比详解。

一、python

1、小知识点。

1)Ture/False首字母必须大写。

2)编码格式

#-*- coding:UTF-8 -*-    表示支持UTF-8中文。需要加双引号。

U'中文' /u'中文'              表示unicode创建实例的格式显示中文。为str类,例print(U'中文')输出中文。python3默认编码为unicode,由str类型进行表示。

字符串前加 r表示一个普通的字符串。

b" "前缀表示:后面字符串是bytes 类型。

Encode ("utf-8")            表示以UTF-8编码对对象进行编码,获取byte类型对象。

Decode ("utf-8")            表示以UTF-8编码对对象进行解码,获取字符串对象。

新版本的python3中,取消了unicode类型,代替它的是使用unicode字符的字符串类型(str),字符串类型(str)成为基础类型如下所示,而编码后的变为了字节类型(bytes)但是两个函数的使用方法不变:

          decode                 encode

bytes ------> str(unicode)------>bytes

u = '中文' #指定字符串类型对象u
str = u.encode('gb2312') #以gb2312编码对u进行编码,获得bytes类型对象str
u1 = str.decode('gb2312')#以gb2312编码对字符串str进行解码,获得字符串类型对象u1
u2 = str.decode('utf-8')#如果以utf-8的编码对str进行解码得到的结果,将无法还原原来的字符串内容

ASCII全程American Standard Code for Information Interchange,美国信息交换标准代码。7位表示,共128个字符。

ISO8859-1:又称Latin-1,8位,最高位也用了,兼容ASCII,128+128个字符。

简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,英文一个字节,兼容iso8859-1。

Unicode,是一种所有符号的编码。现在的规模可以容纳100多万个符号。问题:没有规定二进制代码如果存储,计算机如何知道三个字节表示一个符号还是表示三个符号;英文一个字节表示一个符号,如果unicode三个字节表示一个符号,前两个字节填充0,资源浪费,不便于传输和存储。unicode对于英文字母需要2个字节表示。

UTF-8是Unicode的实现方式之一,可用来表示所有语言的字符。全称8-bit Unicode Transformation Format,兼容iso8859-1编码。是一种变长的编码方式,可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。一般使用UTF-8,虽然unicode汉字2字节/UTF-8汉字3字节,但是unicode英文2字节/UTF-8英文1字节。

UTF-8规则:

a)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

b)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

Unicode符号范围      |        UTF-8编码方式

(十六进制)           |        (二进制)
----------------------+---------------------------------------------

0000 0000-0000 007F | 0xxxxxxx

0000 0080-0000 07FF | 110xxxxx 10xxxxxx

0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx

0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

例:已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。

windows默认是GBK,Linux默认是UTF-8。

3)

2、方法

1)dir(object)    //类的方法。

2)object.mro()  //object类的父类和本类。

3)enumerate(sequence,[start=0]) //将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。返回 enumerate(枚举) 对象。

a=[1,2,'a']
b='adnscd'
num1=list(enumerate(a))
num2=list(enumerate(b,2))
print(num1)
print(num2)
结果:
[(0, 1), (1, 2), (2, 'a')]
[(2, 'a'), (3, 'd'), (4, 'n'), (5, 's'), (6, 'c'), (7, 'd')]

 4)string.endswith()   判断文件类型,有些时候还会对字符串进行操作应用。例string.endswith('.py')判断string是否带有.py;

string.endswith(str, beg=[0,end=len(string)])
string[beg:end].endswith(str)

相关函数:判断字符串开头 startswith()

 5)rfind() 返回字符串最后一次出现的位置,如果没有匹配项则返回 -1

str.rfind(str, beg=0 end=len(string))

6)reversed()返回一个反转的迭代器。

reversed(seq)   //seq -- 要转换的序列,可以是 tuple, string, list 或 range。
>>> a=('as23')
>>> list(reversed(a))
['3', '2', 's', 'a']

 7)int()函数

用于将一个字符串或数字转换为整型;

class int(x, base=10)    //x为字符串数字或数字;base进制,默认10进制。返回数字。
>>> int(10)
10
>>> int('010',8)
8
>>> int(10)
10
>>> int('0x10',16)
16
>>> int('10',2)
2
>>> int('10',8)
8
>>> int('10',16)
16
>>> int('10',10)
10

 8)random.randint(start,stop)

返回指定范围的整数,randint(1,9)返回1-9的整数,两个参数均为必须。等价于randrange(start,stop+1)

 

3、__init__和__new__对比

1)相同:都是构造方法。

2)__init__(self,name...):

用于初始化对象,实例方法;是当实例对象创建完成后被调用的,用于初始化一个类实例self指刚建好的实例对象;self指__new__返回的实例,__init__在__new__基础上完成一些其他初始化的动作,__init__不需要有返回值;

3)__new__(cls,*args,**kwargs):

用于创建对象,静态方法;必须要有参数cls,cls指类对象;在实例创建之前被调用的,用于创建实例,然后返回该实例对象;必须要有返回值,返回的是实例化出来的实例,两种return:return super(父类,cls).__new__(cls)或object.__new__(cls)。

4)__new__先被调用,__new__的返回值将传递给__init__方法的第一个参数,然后__init__被调用,给这个实例设置一些参数。

5)如果__new__没有返回cls(即当前类)的实例,那么当前类的__init__方法是不会被调用的。

6)如果当前类是直接继承自 object,那当前类的 __new__() 方法返回的对象应该为:

def __new__(cls, *args, **kwargs):
  ...
  return object.__new__(cls) #传入参数是类对象,所以创建类的实例对象时(在不重写基类__new__方法的前提下),返回的就是是类的实例对象

 

4、模块引用

import python文件名.类

from 类 import 模块

import sys,math,time as o  //别名o指time 

1)__import__函数使用,对于python2/3有差异。

s='math'
m=__import__('math')
print(__import__('math').pi)       //或者print(m.pi)。 3.1415...

2)importlib使用,对于python2/3无差别。

import importlib
a=importlib.import_module('math')
print(a.pi)

3)多个模块一个别名,是最后一个的别名。自定义目录下的模块引用,eclipse会报错,不影响结果。

import math,demo01.pydemo,sys as o
print(o.argv[0])
import sys
sys.path.append('/Users/姓名/min-py')
print(sys.path)                     //sys.path特指模块的查询路径的列表,后添加自定义的路径。
from demo00 import Student
s=Student('min',16)
print(s.say_age())

输出:

b1661865162.0244968
gao的年纪是18
c1661865162.0245419
33                            以上四行为demo01.pydemo模块输出的结果。
/Users/姓名/eclipse-workspace/pydemo01/demo01/pydemo07.py       //sys.argv[0]表示代码本身文件路径
['/Users/姓名/eclipse-workspace/pydemo01/demo01', '/Users/姓名/eclipse-workspace/pydemo01', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/Users/姓名/min-py']
min的年纪是16
None

 4)模块的本地发布

 模块相同目录下创建setup.py

from distutils.core import setup
from lxml.html._diffcommand import description
setup(
    name='mypython01',
    version='1.0',
    description='第一个',
    author='min',
    author_email='.163.com',
    py_modules=['pydemo01','pydemo02']    #要发布的模块
    )

cd 到模块目录下,执行python3 setup.py sdist

sdist             create a source distribution (tarball, zip file, etc.)

[localhost:demo02 $ python3 setup.py sdist
running sdist
running check
warning: check: missing required meta-data: url

warning: sdist: manifest template 'MANIFEST.in' does not exist (using default file list)

warning: sdist: standard file not found: should have one of README, README.txt, README.rst

writing manifest file 'MANIFEST'
creating mypython01-1.0
making hard links in mypython01-1.0...
hard linking pydemo01.py -> mypython01-1.0
hard linking pydemo02.py -> mypython01-1.0
hard linking setup.py -> mypython01-1.0
creating dist
Creating tar archive
removing 'mypython01-1.0' (and everything under it)
localhost:demo02 $ ls
MANIFEST    dist        pydemo02.py
__init__.py    pydemo01.py    setup.py
localhost:demo02 $ cd dist/
localhost:dist $ ls
mypython01-1.0.tar.gz
localhost:dist $ cd ..
localhost:demo02 $ cat __init__.py 
localhost:demo02 $ cat MANIFEST 
# file GENERATED by distutils, do NOT edit
pydemo01.py
pydemo02.py
setup.py

生成__init__.py/dist文件下压缩包mypython01-1.0.tar.gz/MANIFEST 下文件列表。

5)第三方模块的安装

localhost:demo02 $ python3 setup.py install
running install
running build
running build_py
creating build
creating build/lib
copying pydemo01.py -> build/lib
copying pydemo02.py -> build/lib
running install_lib
copying build/lib/pydemo01.py -> /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages
copying build/lib/pydemo02.py -> /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages
byte-compiling /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pydemo01.py to pydemo01.cpython-37.pyc
byte-compiling /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pydemo02.py to pydemo02.cpython-37.pyc
running install_egg_info
Writing /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/mypython01-1.0-py3.7.egg-info
localhost:demo02 $ cd /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages

mac第三方模块安装在:/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages

可以直接import pydemo01,pydemo02使用

 

5、库

某个功能的‘模块的集合’成为库。

python标准库的主要功能有:

1)文本处理,包括文本格式化/正则表达式匹配/文本差异计算与合并/unicode支持/二进制数据处理等功能。

2)文件处理,包含文件操作/创建临时文件/文件压缩与归档/操作配置文件等功能。

3)操作系统功能,包含线程与进程支持/IO复用/日期与时间处理/调用系统函数/日志等功能。

4)网络通信,包含网络套接字/SSL加密通信/异步网络通信等功能。

5)网络协议,支持HTTP/FTP/SMTP/POP/IMAP/NNTP/XMLRPC等多种网络协议,并提供编写网络服务器的框架。

6)W3C格式支持,包括HTML/SGML/XML的处理。

7)其他功能,包括国际化支持/数学运算/HASH/Tkinter等。

 

6、使用pycharm工具跑python 

1)限制:只能执行main文件

2)新建python文件,例demo.py

3)在main.py里

posted @ 2021-09-28 22:03  min222  阅读(31)  评论(0编辑  收藏  举报