python 基础

 

 

python 解释型语言。
常用的称为cpython


Python目前有两个版本,Python2和Python3,最新版分别为2.7.13和3.6.2,现阶段大部分公司用的是Python2,Life is shot, you need Python. 人生苦短,我用Python。


4、Python优缺点
	简单————Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。
	易学————就如同你即将看到的一样,Python极其容易上手。前面已经提到了,Python有极其简单的语法。
	免费、开源————Python是FLOSS(自由/开放源码软件)之一。简单地说,你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。这是为什么Python如此优秀的原因之一——它是由一群希望看到一个更加优秀的Python的人创造并经常改进着的。
	高层语言————当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节。
	可移植性————由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程序无需修改就可以在下述任何平台上面运行。这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至还有PocketPC、Symbian以及Google基于linux开发的Android平台!
	解释性————这一点需要一些解释。一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用Python更加简单。由于你只需要把你的Python程序拷贝到另外一台计算机上,它就可以工作了,这也使得你的Python程序更加易于移植。
	面向对象————Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。
	可扩展性————如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。
	丰富的库————Python标准库确实很庞大。它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。记住,只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。
	规范的代码————Python采用强制缩进的方式使得代码具有极佳的可读性。


5、Python应用场景
	Web应用开发
Python经常被用于Web开发。比如,通过mod_wsgi模块,Apache可以运行用Python编写的Web程序。Python定义了WSGI标准应用接口来协调Http服务器与基于Python的Web程序之间的通信。一些Web框架,如Django,TurboGears,web2py,Zope等,可以让程序员轻松地开发和管理复杂的Web程序。
	操作系统管理、服务器运维的自动化脚本
在很多操作系统里,Python是标准的系统组件。 大多数Linux发行版以及NetBSD、OpenBSD和Mac OS X都集成了Python,可以在终端下直接运行Python。有一些Linux发行版的安装器使用Python语言编写,比如Ubuntu的Ubiquity安装器,Red Hat Linux和Fedora的Anaconda安装器。Gentoo Linux使用Python来编写它的Portage包管理系统。Python标准库包含了多个调用操作系统功能的库。通过pywin32这个第三方软件 包,Python能够访问Windows的COM服务及其它Windows API。使用IronPython,Python程序能够直接调用.Net Framework。一般说来,Python编写的系统管理脚本在可读性、性能、代码重用度、扩展性几方面都优于普通的shell脚本。
	科学计算机器学习
NumPy,SciPy,Matplotlib可以让Python程序员编写科学计算程序。
	服务器软件(网络软件)——阿里云
Python对于各种网络协议的支持很完善,因此经常被用于编写服务器软件、网络爬虫。第三方库Twisted支持异步网络编程和多数标准的网络协议(包含客户端和服务器),并且提供了多种工具,被广泛用于编写高性能的服务器软件。




Linux下Python的安装
Python2.x
1、	下载Python2.x的包
2、	tar –zxvf python-2.7.15.tar
3、	yum install gcc
4、	./configure
5、	Make && make install
Python3.x
1、	依赖环境:yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
2、	下载Python3的包
3、	tar –zxvf python-3.6.1.tgz
4、	./configure
5、	Make && make install
6、	添加环境变量 


第二章 python安装下载及基础语法
1、Python的下载
	1、python网址:https://www.python.org/
	2、anaconda网址:https://www.anaconda.com/
注意:Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。
2、Python的安装
	1、Python安装比较简单,只需要双击安装即可,安装比较快(window)
	2、anaconda同样是双击安装,但是安装过程的时间比较长,需要很多依赖项(window)

 

Anaconda  安装  包含许多依赖库。

  

pycharm 推荐开发工具。

python 安装
python-2.7.15.amd64.msi
Anaconda3-5.2.0-Windows-x86_64.exe   自带python3 环境变量

  

 

 

 

 

 

HelloWorld3.py
print("hellow python 中文")

HelloWorld2.py
print("hellow python 中文")

D:\usr\pythondemo\demo00>python D:\usr\pythondemo\demo00\com\bjsxt\HelloWorld3.py
hellow python 中文

切换编译器为python2之后,需要加字符集注释
HelloWorld2.py
#coding=utf-8
# _*_ coding:utf-8 _*_
'''
我是注释
'''
print("hellow python 中文")

## cmd 下也可以。
D:\usr\pythondemo\demo00>python D:\usr\pythondemo\demo00\com\bjsxt\HelloWorld2.py
hellow python 中文

  

5、交互式窗口
	1、python:在cmd中直接输入python(配置环境变量)
	2、ipython:找到对应的ipython的执行文件,直接执行
		Ipython:支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数
		注意:Python中本身不带有这个ipython的交互,需要自行安装。首先查看计算机中是否包含pip,一般安装完之后有,执行python –m pip install --upgrade pip,先将pip进行更新,然后安装ipython:pip install ipython


6 Python的注释及乱码
	1、单行注释:以#开头,#右边的所有东西当做说明,而不是真正要执行的程序,起辅助说明作用
	2、多行注释:’’’多行注释’’’可以写多行的功能说明
	3、Python乱码问题
	   由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
	# -*- coding:utf-8 -*-
	# coding=utf-8

  

 

安装ipython 自动补全
C:\Users\Administrator>python -m pip install --upgrade pip

C:\Users\Administrator>pip install ipython
C:\Users\Administrator>ipython
Python 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit 

In [1]: print("hello")
hello

In [2]: ls

2019/10/02  11:25    <DIR>          ..
2019/04/01  14:32    <DIR>          .android

 

 

 

7、变量及类型
	1、变量的定义
在程序中,有时我们需要对2个数据进行求和,那么该怎样做呢?
大家类比一下现实生活中,比如去超市买东西,往往咱们需要一个菜篮子,用来进行存储物品,等到所有的物品都购买完成后,在收银台进行结账即可
如果在程序中,需要把2个数据,或者多个数据进行求和的话,那么就需要把这些数据先存储起来,然后把它们累加起来即可
在Python中,存储一个数据,需要一个叫做变量的东西:
例如: num1=100 
	   Num2=87
	   Result=num1+num2
变量三要素:变量的名称,变量的类型,变量的值
2、变量的类型
为了更充分的利用内存空间以及更有效率的管理内存,变量是有不同的类型,如图所示

 

 

python 中没有null 用None

  

字符串是以单引号或双引号括起来的内容。
标识符与java类似。驼峰命名,也可以用下划线

ipython 查看## 保留的标识符
In [5]: import keyword  

In [6]: keyword.kwlist
Out[6]:
['False',


希望输出的内容不换行
>>> a=10
>>> print(a)
10
>>> print(a,end="")
10>>>

输出1+2=3
num1 = 1
num2 = 2
print("%d+%d=%d"%(num1,num2,num1+num2))

输出hello,world
a = 'world'
print("hello,%s"%a)
print("hello,%s"%('world'))
print("hello,%s"%'world')

字符串拼接
print('The quick brown fox', 'jumps over', 'the lazy dog')


%d 整数
%f 浮点数
%s 字符串
%x 十六进制整数

print(True,False)

'''
练习:编写程序
小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点,
并用字符串格式化显示出'xx.x%',只保留小数点后1位:
'''
d = (85-72)/72 * 100
print(d)
print("%.1f%%"%d)


输入 python3
a=input("请输入数字:")
print(a)

python2
D:\Develop\Python\Python27>python
Python 2.7.16 (v2.7.16:413a49145e, Mar  4 2019, 01:37:19) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a=input("请输入:")
请输入:123
>>> a=input("请输入:")
请输入:abc
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'abc' is not defined
>>> a=raw_input("请输入")
请输入abc
>>> print(a)
abc
>>> abc='abcdefg'
>>> a=input("请输入")
请输入abc
>>> print(a)
abcdefg


# print(10/3) #3.3333333333333335
# print(10//3) #3      ## 取整
# print(10//3.0) #3.0

# print(2**3) # 8 幂指数

a,b=1,2
print(a,b)

python 中没有a++
用如下:
a = 10
a+=1
>>>

  

 

age=input("请输入年龄:")
age = int(age)
if age>20:
    print("长大了")
elif age >40:
    print("老了")
else:
    print("还小呢")


a = 10
if a >10:
    pass
else:
    pass

# i=1
# sum=0
# while i <=100:
#     sum+=i
#     i+=1
# print(sum)

## 九九乘法表

n = 1
while n <=9:
    c= 1
    while c<=n:
        print("%d*%d=%d"%(c,n,c*n),end="\t")
        c+=1
    n+=1
    print()


sum = 0
for i in range(1,100):
    sum+=i
print(sum)




切片(分片)
切片是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作。
切片的语法:[起始:结束:步长]
步长:表示下标变化的规律。
注意:选取的区间属于左闭右开型,即从"起始"位开始,到"结束"位的前一位结束(不包含结束位本身)。


# _*_ coding:utf-8 _*_
'''
集合
'''

a="abcdefg"
# print(a[0]) #a
# print(a[-1]) ## g
# ## 切片
# print(a[0:3]) ## abc
# print(a[:3]) ## abc
# print(a[2:]) ## cdefg
# print(a[2:7]) ## cdefg
# print(a[2:6]) ##cdef
# print(a[0:4:2])## ac
# print(a[::-1])## gfedcba
print('...........')
print(a[0:6:-1])##

print(a[1:-1]) ##bcdef

######
a="abcdefg"


a="abcdefg"
# print(a.find(a)) ##0
b = "Hello world hi python"
# print(b.title()) ## Hello World Hi Python
# print(a.rjust(20))# [             abcdefg]
# print("*"*50) ## 打印50个星
# print(a.center(50)) 
# print("*"*50)

print(a.isalpha())



list删除元素
<4>删除元素("删"del, pop, remove)
类比现实生活中,如果某位同学调班了,那么就应该把这个条走后的学生的姓名删除掉;在开发中经常会用到删除这种功能。
列表元素的常用删除方法有:
del:根据下标进行删除,其实可以删除所有变量
pop:默认删除最后一个元素
remove:根据元素的值进行删除第一个





## python2.7 (仅这一片段)
>>> a={"aaa":12,"bbb":23,"ccc":34}
>>> a.has_key("aaa")
True





s="abcdefg"
# print(s[20]) ## 报错,
print(s[2:20]) ## 不报错

'''
列表
'''

# a=["a","b","c",12,12.34]
# print(a)
# print(a.__len__(),len(a))
# print(a[100])  ## 报错
# print(a[-1])

# print(a[::-1]) ## 反转

# a.append("e")
# a.extend("f")
# b=["aa","bb","cc"]
# a.extend(b)

# a.insert(2,"hello")
# del(a)
# a.pop()
# a.remove(12)
# a.__delitem__(1)

# if "a" in a:
#     print("存在")
# else:
#     print('不存在')


# print(a.index("a"))
# print(a.index("c",2,6)) ## 从索引2找到6

# a=["a","b","c",12,12.34,"a","b"]
# print(a.count("a"))
# print(a)

# list存放 有序,不唯一的数据,数据类型不必一致
# print(a.sort()) ## TypeError: '< 排序类型必须一致


# c=[1,2,3,5,72,2]
# print(c)
# c.sort()
# print(c)
# c.reverse()
# print(c)
#
# for i,chrs in enumerate(c):
#     print("%d-----%d"%(i,chrs))
#
# c[2] = "abcdefg"
# print(c)

'''
元组
'''

# a = ("a","b","c","d")
# a[2]="d"  ## TypeError: 'tuple' object does n  元组不能修改数据
# print(id(a))
# b= (1,2,3,4,5)
# print(id(b))    ## 返回引用
# a=b
# print(id(a))
# print(a)


# t=(1)
# print(t) # 1
# t=(1,)   ## 注意逗号才表示元组
# print(t) (1,)


'''
可变tuple
'''
# t=("a","b",["A","B"])
# print(t)
# t[2][0] = "X"
# t[2][1]= "Y"
# y=["X","Y"]
# t[2] = y ## TypeError: 'tuple' object 不能对直接子元组元素的引用进行修改
# print(t.index("a",))
# print(t.count("a"))
# print(t)

'''
dict 字典
'''
#dict
person={"aaa":12,"bbb":23,"ccc":34}
# print(person) ## {'aaa': 12, 'bbb': 23, 'ccc': 34}
# print(person['aaa'])
# abc = {"a","b","c"}  ## set 可以为没有value的字典
# print(abc)

## 字典遍历

# for key in person.keys():
#     print(key)

# for value in person.values():
#     print(value)

# for item in person.items():
#     print(item)
#
# for k,v in person.items():
#     print(k,v)

## 修改元素
# person["aaa"] = 100

# person["ddd"] = 200

# del(person["bbb"])
# person.clear() ## {}
# del(person) ## 从内存中移除 or: name 'person' is not defined

print(person.ha)
print(person)



6、总结:
1、请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。
2、和list比较,dict有以下几个特点:
1)查找和插入的速度极快,不会随着key的增加而变慢;
2)需要占用大量的内存,内存浪费多。
3)而list相反:查找和插入的时间随着元素的增加而增加;占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。


总结:
1、可变类型,值可以改变:
列表 list
字典 dict
set  (没有value的字典)
2、不可变类型,值不可以改变:
数值类型 int, long, bool, float
字符串 str
元组 tuple
'''
函数
'''

# def test():
#     print("I'm function")
# # 调用;
# test()   ## 不到定义重复的文件test  __init__.py 不要删除

# def add(a,b):
#     print(a+b)

# def add(a,b=2):  ## 可以带有默认值
#     print(a+b)

# add(1,2)
# add(1)
# add(b=3,a=5)
# a=1
# b=2
# add(a,b)

'''
不定长参数
'''

# def function(a,b,*args,**kwargs):
#     print(a,b)
#     print(*args)
#     for i in kwargs.items():
#         print(i)
#
# function(1,2,3,4,5,6,7,8,x=9,y=10)


# a=[1,2]
# a+=a
# print(a) # [1, 2, 1, 2]

'''
可变类型与不可变类型的传参
'''

# def add3(a):
#     a+=1
#     print(a)
#
# a = 10
# add3(a)
# print(a)## 10


# def add3(a):
#     a+=a
#     print(a)

# a =[1,2]
# add3(a)
# print(a) # [1, 2, 1, 2]

# a=(1,2)
# add3(a)
# print(a) #(1, 2)

'''
Python中函数参数是引用传递(注意不是值传递)。对于不可变类型,因变量不能修改,
所以运算不会影响到变量自身;而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量。
'''


'''
函数返回值
'''

# def func(a,b):
#     c = a+b
#     return c
# print(func(2,3)) ## 5


# def func2(a):
#  b = 100+a
#  c=200+a
#  return b,c   # 返回值可以是多个
#
# b,c = func2(200)
# print(b,c)  ## 300 400



'''
局部变量和全局变量
'''

# a=10
# def func(a):
#     a+=10
#     print(a)
# func(100)

# a=10
# def func():
#     a+=10
#     print(a)
# func() ## local variable 'a' referenced before assignment


# a=10
# def func():
#     a=10
#     print(a)
# func() ## local variable 'a' referenced before assignment


# a=10
# print(id(a))
# def func():
#     global a
#     a=a+ 10
#     print(id(a))
#     print(a) # 20
# func() ## local variable 'a' referenced before assignment
# print(a) # 20

# a = 100
# print(id(a))
# def test1():
#     a=10
#     print(a)
#     a=20
#     print(a)
#
# def test2():
#     global a
#     print(a)
#     a += 200
#     print(a)
#     print(id(a))
#
# # test1()
# test2()
# print(id(a))

b = 10
def test():
    print(b) ## 引用可以
    # b=20  ## 修改值不允许 UnboundLocalError: local variable 'b' referenced before assignment
    c=b
    print(c)

test()

 

# _*_ coding:utf-8 _*_
'''
递归函数
'''

'''
斐波那契数列
'''
# def createNum(a):
#     arr = []
#     def getNum(b):
#         if b <2:
#             return 1
#         else:
#             return getNum(b-1) + getNum(b-2)
#     for i in range(0,a):
#         arr.append(getNum(i))
#     print(arr)
#
# createNum(10)


'''
lambda : 小型的匿名函数
'''

# sum = lambda a,b:a+b
# print(sum(1,2))

# def test(a,b,opt):
#     print(a)
#     print(b)
#     print("result:%d"%opt(a,b))
#
# test(1,2,lambda a,b:a+b)

stus = [ {"name":"zhangsan", "age":18}, {"name":"lisi", "age":19}, {"name":"wangwu", "age":17} ]
# stus.sort(key=lambda x:x['name'])
stus.sort(key=lambda x:x['age'])
print(stus)

  

 

 

 

 

# _*_ coding:utf-8 _*__

'''
文件操作
'''

f = open("./test.txt","r")
# a = f.read()
# a = f.readlines()
# a = f.readline()
# p = f.tell() ## 位置
# print(a)
# print(p)
# f.close()

# f = open("./test.txt","w")
# f = open("D:\\usr\\pythondemo\\demo00\\com\\bjsxt\\test.txt","w")  ## 注意转义
# f = open(r"D:\usr\pythondemo\demo00\com\bjsxt\test.txt","w")  ## r 表示字符是本身的含义
# f.write("hello Appollo; python is simple 1")
# f.close()



f = open("./test.txt","rb")
a = f.readline()
print(a)
# f.seek(0,0)  ## 又从头开始读取
f.seek(-20,2)  ## 需要rb模式
a = f.read()
print(a)
f.close()

  

import os
# print(os.name) ##  Windows 返回 ‘nt'; Linux 返回’posix'
# print(os.getcwd())
# print(os.listdir("d:"))
# os.remove("./test1.txt")


'''
set 补充 # 相当于没有value的字典
'''
a = set([1,2,3,4])
print(a)

  

 

 

 

 

 

1、__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
2、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例
3、__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
4、我们可以将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节

  

 

 

'''
类和对象
'''

# class Dog:
# class Dog(object):
#     def run(self):
#         print("running")
#
# dog =  Dog()
# print(id(dog))
#
# dog2 =  Dog()
# print(id(dog2))
#
# dog.run()


# class Dog:
#     def run(self):
#         print("running")
#
# dog =  Dog()
# dog.name = "hello"
# dog.run()
# print(dog.name)
#
# dog2 =  Dog()
# dog2.age =12
# print(dog2.age)


class Dog:
    def run(self):
        print("running")
        ## init 不是构造器只是完成对象的初始化
    # def __init__(self):
    #    print("init被调用")
    def __init__(self,name,age): ##对象的初始化,完成一些默认的设定
        print("init被调用")
        self.name = name
        self.age = age
    def __new__(cls,name,age):    ## 这里才是创建对象
        print("new被调用")
        return object.__new__(cls)
    def __del__(self):
        print("对象被删除,和回收%s"%self.name)

    def __str__(self):
        # return object.__str__(self)
        # return "hello python"
        return "name:%s,age:%s"%(self.name,self.age)

## 先执行创建对象,再初始化
dog =  Dog("旺财",7)
# dog.run()
# print(dog.name)
# dog2 =  Dog("旺财22",17)
# print(dog2.age)
#
# print(dog)
# print(dog2)

# dog.run()
dog2 = dog
dog3 = dog

print("dog2 被删除")
del dog2
print("dog3 被删除")
del dog3
print("dog 被删除")
del dog
## dog 一直被引用,直到最后才删除。

"魔法"方法

  

 

 

'''
私有属性
'''

class Person(object):
    def __init__(self,name,age):
        self.__name = name   ## 属性前加"__" 为私有属性
        self.age = age
    def setName(self,name):
        if len(name) >3:
            self.__name = name
        else:
            print("名字长度不符合规范")

    def getName(self):
        return self.__name

    def __test(self):
        print("test")
    def test2(self):
        self.__test()

p = Person("张三",12)
# # print(p.__name) ## AttributeError: 'Person' object has no attribute '__name'
# print(p.getName(),p.age)
# p.setName("dd")

# p.__test() ## AttributeError: 'Person' object has no attribute '__test'
p.test2()  ## 用共有方法访问私有方法



# class Animal(object):
#     def __init__(self,name):
#         self.name = name
#
#     def eat(self):
#         print("吃的很开心")
#
# class Cat(Animal):
#     def __init__(self,name,age):
#         Animal.__init__(self,name)
#         self.age = age
#
#     def run(self):
#         print("running")
#
#
# cat = Cat("哈哈",12)
# cat.run()
# cat.eat()
# print(cat.name)
# print(cat.age)


'''
单继承
'''

# class Animal(object):
#     def __init__(self, name='动物', color='白色'):
#         self.__name = name
#         self.color = color
#     def __test(self):
#         print(self.__name)
#         print(self.color)
#     def test(self):
#         print(self.__name)
#         print(self.color)
#
#
# class Dog(Animal):
#     def dogTest1(self):
#         # print(self.__name)
#         # 不能访问到父类的私有属性
#         print(self.color)
#     def dogTest2(self):
#         # self.__test()
#         # 不能访问父类中的私有方法
#         self.test()
#
#
# A = Animal()
# # print(A.__name)
# # 程序出现异常,不能访问私有属性
# print(A.color)
# # A.__test()
# # 程序出现异常,不能访问私有方法
# A.test()
# print("------分割线-----")
# D = Dog(name="小花狗", color="黄色")
# D.dogTest1()
# D.dogTest2()


'''
多继承
'''

class A(object):
    def test(self):
        print("---------A----------")

class B(object):
    def test(self):
        print("------B-----")

class C(A,B):
    # def test(self):
    #     A.test(self)  ## 犯法重复时,必须指定父类方法

    # def test(self): ## 打印A ,
    #     pass

    def test(self): ## 打印A ,
        # super(C,self).test()
        super().test()

c = C()
c.test()
# print(C.__mro__)
## (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

  

 

 

# class Person(object):
#     name="zhangsan"
#
#     def __init__(self,name,age):
#         self.name = name
#         self.age = age
#
# p = Person("lisi",12)
# print(p.name) ## lisi
# p.name="wangwu"
# print(p.name) ## wangwu
# print(Person.name) ## zhangsan
# Person.name = "maliu"
# print(Person.name) ## maliu
# print(p.name)



# class Person(object):
#     name="zhangsan"
#     # def __init__(self,name,age):
#     #     self.name = name
#     #     self.age = age
#
# p = Person()
# print(p.name) ## zhangsan
# p.name="wangwu"
# print(p.name) ## wangwu
# Person.name = "maliu"
# print(Person.name) ## maliu
# print(p.name) ## wangwu


'''
类方法和静态方法
'''

class Person(object):
    name="zhangsan"
    @classmethod
    def test(cls):
        print("类方法")
    def test2(self):
        print("test2")
    @staticmethod
    def test3():
        print("test3")

p = Person()
p.test()
p.test2()
Person.test()
# Person.test2(p) ## TypeError: test2() missing 1 required positional argument: 'self'
Person.test3()

  

《设计模式之禅》 实例比较浅显易懂

  

'''
设计模式
'''

'''
单例模式
'''
#
# class Singleton:
#     __instance = None
#     def __new__(cls):
#         if not cls.__instance:
#             __instance=object.__new__(cls)
#         return cls.__instance
#
# a = Singleton()
# b=Singleton()
# print(id(a))
# print(id(b))


'''
简单工厂模式
'''

class Person(object):
    def __init__(self,name):
        self.name = name
    def work(self,type_axe):
        print("%s开始工作了"%(self.name))
        # axe=StoneAxe()
        # axe=SteelAxe()
        axe = Factory.create_axe(type_axe)
        axe.cut_tree()


class Axe(object):
    def cut_tree(self):
        print("正在砍树")

class StoneAxe(Axe):
    def cut_tree(self):
        print("使用石头做的斧子砍树")
class SteelAxe(Axe):
    def cut_tree(self):
        print("使用钢铁做的斧子砍树")



class Factory(object):
    @classmethod
    def create_axe(self,type_axe):
        if  type_axe == "stone":
            return StoneAxe()
        elif type_axe == "steel":
            return SteelAxe()
        elif type_axe == "water":
            return SteelAxe()
        else:
            print("传入的参数不对")

p = Person("张三")
p.work("steel")
p.work("stone")
## 切换斧子不太方便,需要工厂模式

## 斧头增加类型了
class WaterAxe(Axe):
    def cut_tree(self):
        print("使用水做的斧子砍树")

p.work("water")

  

'''
异常
'''

# f = None
# try:
#     # print(num)
#     print("test1")
#     f = open("./123.txt","r") ## FileNotFoundError:
#     print("test2")
# except (FileNotFoundError,NameError) as errormsg:  ## errormsg 存储异常信息的基本描述
#     print("报错了")
#     print(errormsg)
# else:
#     print("没有异常")
# finally:
#     print("finally")
#     if  f:
#         f.close()
#
# print("test3")


'''
自定义异常
'''


class ShortInputException(Exception):
    '''自定义的异常类'''
    def __init__(self, length, atleast):
        # super().__init__()
        self.length = length
        self.atleast = atleast

def main():
    try:
        s = input('请输入 --> ')
        if len(s) < 3:  # raise引发一个你定义的异常
             raise ShortInputException(len(s), 3)
    except ShortInputException as result:  # x这个变量被绑定到了错误的实例
        print('ShortInputException: 输入的长度是 %d,长度至少应是 %d'% (result.length, result.atleast))
    else:
        print('没有异常发生.')
main()

  

<5>定位模块
当你导入一个模块,Python解析器对模块位置的搜索顺序是:
1、当前目录
2、如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
3、如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
4、模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

  

<6>安装模块
conda create -n py2 python=2.7
conda install 模块
pip install 模块 
pymysql
numpy


__init__.py

'''
可以将from import 的内容写到这里
'''

test.py

def add(a,b):
    return a+b

def sub(a,b):
    return a-b



'''
模块导包
'''

import os
# from os import  *  ## 最好需要谁就导谁
from os import path
# print(os.getcwd())
# print(os.path.isfile("./ImportDemo.py"))
# print(path.isfile("./ImportDemo.py"))

import pygame  ## 没有,需要安装 ## C:\Users\Administrator>pip install pygame

import pymysql
'''
pip 是python自带的安装方式
pip install 模块 
annaconda 也有一种安装方式
conda install 模块

pymysql
numpy
'''

## 导入自己写的包
import test
result = test.add(1,2)
print(result)

result = test.sub(3,2)
print(result)






模块的发布
1.mymodule目录结构体如下:
. 
├── setup.py 
├── suba 
│ 	├── aa.py 
│ 	├── bb.py 
│ 	└── __init__.py 
└── subb 
├── cc.py 
├── dd.py 
└── __init__.py 
2.编辑setup.py文件
py_modules需指明所需包含的py文件
from distutils.core import setup 
setup(name="压缩包的名字", version="1.0", description="描述", author="作者", py_modules=['suba.aa', 'suba.bb', 'subb.cc', 'subb.dd'])
3.构建模块
python setup.py build
4.生成发布压缩包
python setup.py sdist




## 使用pip 暗转模块

C:\Users\Administrator>pip install pygame

C:\Users\Administrator>pip install pymysql

C:\Users\Administrator>pip install numpy

  

 

 

'''
列表推导式
'''

for i in range(1,10):
    print(i)

a = [i for i in range(1,10)]
print(a)

a = [i for i in range(1,10) if i%2==0]
print(a)

b = [(i,j) for i in range(1,10) for j in range(1,10)]
print(b) ## 81个

b = [(i,j,k) for i in range(1,10) for j in range(1,10) for k in range(1,10)]
print(b) ##


b = ((i,j) for i in range(1,10)) ## 列表推导式不能这么写,不是叫元组推导式
print(b) ## <generator object <genexpr> at 0x000001C9C2AF3678>
# print(b[1]) ## TypeError: 'generator' object is not subscriptable
d = (1,2,3)
print(d)

  

  

  

'''
连接mysql数据库

pip install pymysql

新建数据库名test,导入如下数据

DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`DEPTNO` int(2) NOT NULL,
`DNAME` varchar(14) DEFAULT NULL,
`LOC` varchar(13) DEFAULT NULL,
PRIMARY KEY (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `dept` VALUES ('10', 'ACCOUNTING', 'NEW YORK');
INSERT INTO `dept` VALUES ('20', 'RESEARCH', 'DALLAS');
INSERT INTO `dept` VALUES ('30', 'SALES', 'CHICAGO');
INSERT INTO `dept` VALUES ('40', 'OPERATIONS', 'BOSTON');

DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`EMPNO` int(4) NOT NULL,
`ENAME` varchar(10),
`JOB` varchar(9),
`MGR` int(4),
`HIREDATE` date,
`SAL` int(7),
`COMM` int(7),
`DEPTNO` int(2),
PRIMARY KEY (`EMPNO`),
KEY `FK_DEPTNO` (`DEPTNO`),
CONSTRAINT `FK_DEPTNO` FOREIGN KEY (`DEPTNO`) REFERENCES `dept` (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



INSERT INTO `emp` VALUES ('7369', 'SMITH', 'CLERK', '7902', '1980-12-17', '800', null, '20');
INSERT INTO `emp` VALUES ('7499', 'ALLEN', 'SALESMAN', '7698', '1981-02-20', '1600', '300', '30');
INSERT INTO `emp` VALUES ('7521', 'WARD', 'SALESMAN', '7698', '1981-02-22', '1250', '500', '30');
INSERT INTO `emp` VALUES ('7566', 'JONES', 'MANAGER', '7839', '1981-04-02', '2975', null, '20');
INSERT INTO `emp` VALUES ('7654', 'MARTIN', 'SALESMAN', '7698', '1981-09-28', '1250', '1400', '30');
INSERT INTO `emp` VALUES ('7698', 'BLAKE', 'MANAGER', '7839', '1981-05-01', '2850', null, '30');
INSERT INTO `emp` VALUES ('7782', 'CLARK', 'MANAGER', '7839', '1981-06-09', '2450', null, '10');
INSERT INTO `emp` VALUES ('7788', 'SCOTT', 'ANALYST', '7566', '1987-04-19', '3000', null, '20');
INSERT INTO `emp` VALUES ('7839', 'KING', 'PRESIDENT', null, '1981-11-17', '5000', null, '10');
INSERT INTO `emp` VALUES ('7844', 'TURNER', 'SALESMAN','7698', '1981-09-08', '1500', '0', '30');
INSERT INTO `emp` VALUES ('7876', 'ADAMS', 'CLERK', '7788', '1987-05-23', '1100', null, '20');
INSERT INTO `emp` VALUES ('7900', 'JAMES', 'CLERK', '7698', '1981-12-03', '950', null, '30');
INSERT INTO `emp` VALUES ('7902', 'FORD', 'ANALYST', '7566', '1981-12-03', '3000', null, '20');
INSERT INTO `emp` VALUES ('7934', 'MILLER', 'CLERK', '7782', '1982-01-23', '1300', null, '10');


'''

import  pymysql as pm
conn = pm.connect("node1","root","123456","demo")  ## Connection
cursor=conn.cursor()
cursor.execute("select * from emp")
# emp = cursor.fetchone()
# print(emp)  ## (7369, 'SMITH', 'CLERK', 7902, datetime.date(1980, 12, 17), 800, None, 20)
# print(type(emp)) ##<class 'tuple'>

all = cursor.fetchall()
print(all)  ## ((7369,
conn.close()


#coding:utf-8
import  pymysql

class MysqlHelper(object):
    config={
        "host":"node1",
        "user":"root",
        "password":"123456",
        "db":"demo",
        "charset":"utf8"
    }
    def __init__(self):
        self.connection=None
        self.cursor=None

    # 从数据库表中查询一行数据 select count(*) from emp
    def getOne(self,sql,*args):
        try:
            self.connection = pymysql.connect(**MysqlHelper.config)
            self.cursor = self.connection.cursor()
            self.cursor.execute(sql,args)
            return self.cursor.fetchone()
        except Exception as ex:
            print(ex,ex)
        finally:
            self.close()

    # 从数据库表中查询多行数据
    def getList(self,sql,*args):
        try:
            self.connection = pymysql.connect(**MysqlHelper.config)
            self.cursor = self.connection.cursor()
            self.cursor.execute(sql,args)
            return self.cursor.fetchall()
        except Exception as ex:
            print(ex,ex)
        finally:
            self.close()

    # 对数据库进行增,删,改
    def executeDML(self,sql,*args):
        try:
            self.connection = pymysql.connect(**MysqlHelper.config)
            self.cursor = self.connection.cursor()
            self.cursor.execute(sql,args)#  返回 sql语句执行之后影响的行数
            new_id = self.connection.insert_id() # 返回系统刚刚自动生成的id
            self.connection.commit();
            return new_id
        except Exception as ex:
            self.connection.rollback()
            print(ex,ex)
        finally:
            self.close()

    def close(self):
        if self.cursor:
            self.cursor.close()
        if self.connection:
            self.connection.close()

if __name__ == "__main__":
    helper = MysqlHelper()
    print(helper.executeDML("delete from dept where deptno=%s",80))
    # print(helper.executeDML("insert into dept values(%s,%s,%s)","80","admin","beijing"))

  

1.	Numpy是什么?
NumPy(Numerical Python的缩写)是一个开源的Python科学计算库。使用NumPy,就可以很自然地使用数组和矩阵。 NumPy包含很多实用的数学函数,涵盖线性代数运算、傅里叶变换和随机数生成等功能。
这个库的前身是1995年就开始开发的一个用于数组运算的库。经过了长时间的发展,基本上成了绝大部分Python科学计算的基础包,当然也包括所有提供Python接口的深度学习框架。


4.	numpy 基础:
NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型。在NumPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。NumPy的数组类被称作 ndarray(矩阵也叫数组) 。通常被称作数组。常用的ndarray对象属性有:ndarray.ndim(数组轴的个数,轴的个数被称作秩),ndarray.shape(数组的维度。这是一个指示数组在每个维度上大小的整数元组。例如一个n行m列的矩阵,它的shape属性将是(2,3),这个元组的长度显然是秩,即维度或者ndim属性),ndarray.size(数组元素的总个数,等于shape属性中元组元素的乘积),ndarray.dtype(一个用来描述数组中元素类型的对象,可以通过创造或指定dtype使用标准Python类型。另外NumPy提供它自己的数据类型)。

'''
numpy 库

矩阵

机器学习
'''

import  numpy as np

# arr = np.array([[1,2,3],[4,5,6]])
# print(arr)
# print(arr.ndim)   ## 轴的个数,秩
# print(arr.dtype)  ## np.arange(1,10)
# print(arr.shape)  ## (2, 3) 行列数量
# print(arr.size)  ## 6

## 三维数组
# arr = np.array([[[1,2],[3,4],[5,6]],[[7,8],[9,10],[11,12]]])
# print(arr)
# print(arr.ndim)
# print(arr.dtype)
# print(arr.shape) ## (2, 3, 2)
# print(arr.size)


'''
创建数组的方式2
'''
# arr = np.arange(10).reshape(2,5)
# print(arr)
#
# arr = np.arange(27).reshape(3,3,3)  ## 0-26
# print(arr)

# arr = np.arange(35).reshape(3,3,3)  ## ValueError: cannot reshape array of size 35 into shape (3,3,3)
# print(arr)

# arr = np.random.random((2,5)) ## 随机小数[0,1) 10个, 2x5矩阵
# arr = np.random.randn(2,3) ## 正太分布
# arr = np.zeros((2,3)) ## 所有元素是0
# arr = np.ones((2,3))  ## 所有元素是1
# arr = np.empty((2,3))  ## 所有元素是0
# print(arr)

# arr=np.arange(10).reshape(2,5)
# print(arr)
# print(np.where(arr>5,arr,0))
# '''
# [[0 0 0 0 0]
#  [0 6 7 8 9]]
# '''


# arr=np.random.randint(1,10,20).reshape(4,5)
# print(arr)
# print(arr[0])
# print(arr[0,0])
# print(arr[:,0])  ## 取第一列
# ## 取第一行和第四行
# print(arr[0:4:3])
# print(arr[[0,3]])
## 第一列和第四列
# print(arr[0:,0:5:3])
# print(arr[:,[0,3]])
# ## 第二三行,第二三列
# print(arr[[1,2]])
# print(arr[[1,2],1:3])
# print(arr[[1,2],[1,2]]) ## 合并成坐标了 不行


# for i in range(0,arr.shape[0]):
#     print()
#     for j in range(0,arr.shape[1]):
#         print(arr[i][j],end=" ")


# print(arr.sum())
# print((arr>5).sum())  ## 大于5的个数
# print(arr.sum(0)) ## 逐行相加
# print(arr.sum(1)) ## 逐列相加


# arr=np.random.randint(1,10,20).reshape(4,5)
# arr1=np.random.randint(1,10,20).reshape(4,5)
# print(arr)
# print(arr1)
# print(arr+arr1)

'''
相乘
'''
# arr=np.random.randint(1,10,20).reshape(4,5)
# arr1=np.random.randint(1,10,20).reshape(5,4)
# print(arr)
# # print(arr1)
# # print(np.dot(arr,arr1))
# print(arr.T)  ## 转置 旋转


# a = np.arange(10).reshape(2,5)
# print(a.resize(5,2))
# print(a)
b = np.arange(6).reshape(2,3)
print(b)
c = np.ones((2,3))
print(c)
# d = np.hstack((b,c))              # hstack:horizontal stack 左右合并
# print(d)
# e = np.vstack((b,c))              # vstack: vertical stack 上下合并
# print(e)
# f = np.column_stack((b,c))
# print(f)
# g = np.row_stack((b,c))
# print(g)
# h = np.stack((b, c), axis=1)      # 按行合并
# print("--h------")
# print(h)
# i = np.stack((b,c), axis=0)       # 按列合并
# print("--i------")
# print(i)
# j = np.concatenate ((b, c, c, b), axis=0)   #多个合并
# print(j)

print()
print()
print()
i = np.stack((b,c), axis=0)       # 按列合并
print(i)
print(i.shape)

#分割
k = np.hsplit(i, 2)
print(k)
l = np.vsplit(i, 2)
print(l)
m = np.split(i, 2, axis=0)
n = np.split(i, 2,axis=1)
print(m)
print(n)
o = np.array_split(np.arange(10),3)   #不等量分割
print(o)

'''
机器学习

深度学习
    神经网络
'''

  

 

  

 

 

  

posted @ 2019-10-02 01:04  星回中道  阅读(286)  评论(0编辑  收藏  举报