记录参与python基础知识14天(08/28-09/10)打卡学习活动,每天更新
python 第一天(08/28)
1 python 的历史
1.1 python的历史(2.7/3.5)
1.2 python的安装(64位安装包)
jupyter 记事本软件
1.3 python的基础语法
注释(#)、数字(浮点数 整数区分)、字符串(单引号 双引号 三引号 成对)
布尔值(True False 大小写敏感)、空值(None 大小写敏感)、
字符串转义(\)
Raw String (开始加r,字符串不发生转义)
Unicode 字符串 (字符串前加u,每一个位表示一个“字”)(中文的全面支持)
python 第二天(08/29)
变量/算法和表达式
2.1 变量
一个名字,首字母为字母或着下划线,可以使用字母、下划线、数字(浮点数
大小写敏感,
不要使用大小写的方式区分不同的变量
2.2 变量类型
变量指向一个值,值拥有一个类型。
变量无类型,变量指向的值有类型,
运行前,不能知道变量对应的类型
动态类型语言
2.3 算符和表达式
2.3.1 算符
是连接一个或多个元素的符合,用来表达计算
常用算符:
+ - * ** / // % << >> & | ^ ~ <> <= >= == != not and or
python2 与 python3 中,要注意/ 运算的小数处理
2.3.2 算符优先级
尽可能使用()来表明优先级,易于阅读为优。
2.3.3 表达式
一串由算符连接的元素
2.3.4格式化字符串
用于输出格式化的数据内容 format %
print("hello {0}, 今天 {1}".format("wly","星期四"))
print("hello %s ,今天 %s" % ("wly","星期四"))
python 第三天
3 执行流控制
控制流的先后执行顺序。
3.1 逻辑行和物理行
- 逻辑行:一个业务逻辑,可以多行
- 物理行:一行
一个逻辑行可以分成多个物理行。
一行内容限制在80个字符以内
格式的缩进是很重要的部分,会对流程及业务代码产生影响
- 单行写法:
检测一个条件,不满足就结束
一行保持在80个字符以内,超出后会自动换行,不太友好。
3.2 if
if (条件):
代码块
else:
代码块
#多条件判断
if 条件1:
print("条件1")
elif 条件2:
print("条件2")
else:
print("3")
获得输入的内容:input是python3写法 raw_input 是python2写法
3.3 while
条件初始值(真值)
while 执行循环的条件:
代码块
else:
代码块(执行while外的处理)
设置条件为假值
3.4 for
用户枚举对象
for i in range(1,5): #range()前包后不含
print(i)
else:
print("over")
3.5 break 退出当前循环,中断
一般用于循环处理中,判断当满足某一条件时,进行中断流程退出操作。
注:break 是退出最近的一个循环流程。了解与return的区分(return 用于一个函数中的结束)
3.6 continue
跳出本次循环,进行下一次循环。
while true:
s= input("enter something:")
if(条件1):
break
if(条件2):
print("2")
continue
print("end")
3.7 练习题
结果:5,6,7,8,9
python 第四天
4 函数/局部变量/作用域
4.1 函数
可以无参,可以多个参数
def hello():
print("hello")
hello()
def hello_name(name):
print("hello {0}".format(name))
hello_name("wly")
4.2 局部变量 /全局变量
函数体内定义的变量为局部变量
在模块内定义的变量为全局变量
局部变量:生命周期随函数的创建而开始,结束而终结
局部变量与全局变量的区别之处就是变量的作用域不同
函数内可以使用全局变量和自身定义的局部变量,不能调用其他函数的局部变量
函数内使用global 定义一个全局变量
4.3 作用域
变量可见的范围是变量的作用域
原则:内层作用域可以访问外层作用域的变量,反之不行。
内外作用域存在同名称变量,内层的被使用
建议内外作用域中的变量名称保持不一致,否则容易引发 unbound 异常
4.4 参数默认值
函数定义时提供给参数的值,
不要使用可变对象作为参数默认值,可以使用None作为默认值来规避,在函数内部进行None判断
提供默认值的参数必须在无默认参数的右侧
python 第五天
5 返回值/lambda表达式
5.1 返回值
-
函数内数据传递到外部,return
doc String 为每个函数增加一个文档字符串,可以被代码访问。
在函数的第一个逻辑行定义一个字符串
访问方式是function.docdef fun(): ''' 函数说明 \n abcdefg''' print("fun") fun.__doc__
5.2 lambda 表达式
快速定义简单函数的方法
def inc = lambda n:(n+1)
print(inc(10))
def fib(n):
if n<=1 :return 1
return fib(n-1) + fib(n-2)
fib(10)
5.3 模块 module
预先写好的代码快,供其他代码使用。
一个module是一个独立文件
每个module拥有自己的全局变量空间。
数据定义,函数,均定义在其中
writefile testmod.py
a=1
b = 2
def add(a,b):
return a+b
if __name__ == "__main__":
print(" test")
import testmod
testmod.a
5.4 from import 语句
引入模块中的某个(或全部)变量
form testmod import a 直接使用a
注:只引用模块,不推荐引用变量
**dir ** 列出某个模块所有变量
python 第六天
6 模块预编译/Mian文件模式写法
6.1 模块预编译
当import 时,python会编译出pyc文件。
先把字符串编译为中间代码,和Java C 类似。
好处:加速处理。坏处:时间紊乱会导致异常。
python3 3.2以后,会在当前目录下生成pycache目录,缓存pyc文件,避免解释器无法载入对应的pyc文件。
name 属性
当 模块的属性name 为”main"时,说明当前模块被作为脚本运行(此时不会生成pyc文件)。
当作为import模块时,name为模块名称
if __name__ == "__main__":
print("script")
6.2 Mian 文件模式写法
#!/usr/bin/python # 脚本说明
# _*_ coding: utf-8 _*_ #编码格式
```
@date: 2019-09-02 #文件说明
@author: wly
@copyright: 2019. wly
@license: testdemo
```
6.3 package
package 是比modules 更大一级的结构(目录)
一个package 可以包含多个modules 和packages 。
一般一个package是一个独立的目录,包含init.py文件,该文件说明了如何加载整个package
python 第七天
7 内置数据结构
7.1 list
具有顺序、可以随意访问其中位置、可以添加删除、其中的元素不需要是同类型
shoplist = ["dfasd","dddd","eeee","dasdf"]
shoplist2 = list()
shoplist2.append("dddd")
len(shoplist) #获取list长度
shoplist.sort() #排序
7.2 tuple
具有顺序、随意访问任意位置、不可以添加删除、其中的元素不需要是同类型
zoo = ("python", "ddddd","java", "camel")
new_zoo = "monkey", "dddddfas", zoo
7.3 操作序列对象
通过[]访问、通过[]设定、通过for枚举、通过[:]设定、通过[:]访问、通过[::]步进
shoplist = ["apple", "mango", "carrot", "banana"]
shoplist[0] # 第一个
shoplist[-1] # 倒数第一个
shoplist[1:3] #前闭后开 取1,2,位的数据,不包含第3位
shoplist[2:] # 从2到尾,不含尾
shoplist[::-1] # 步进,-1表示取一位向前一步,1表示取一位向后一步
python 第八天
8 练习和列表推导式
8.1 练习
- 1.一个list ,内容为10以内所有质数
prime = [2,3,5,7]
- 计算100内所有质数的列表
试商法
- 计算100内所有质数的列表
primes = [2,3,5,7]
for i in range(10,100):
prime = True
for j in primes[:5]:
if i % j ==0:
prime = False
break
if prime:
primes.append(i)
print(primes)
# ------
primes =[]
l = list(range(2,100))
while l:
j = l.pop(0)
primes.append(j)
i = 2
while j*i <=100:
if j * i in l:
l.remove(j*i)
j +=1
print(primes)
- 将这个列表转为tuple
tuple(primes)
- 反转tuple
tuple(primes)[::-1]
- list操作:第一个list拥有原list前一半的反向,第二个list拥有原list后一半的反向
primes[:len(primes)//2:-1], primes[len(primes)//2::-1]
8.2 列表推导式
有一个列表,借助这个列表生成另一个列表
l = range(12)
t = [i * i for i in l]
print(t)
primes = [2,3,5,7]
for i in range(10,100):
prime = True
for j in primes:
if i % j ==0:
prime = False
break
if prime:
primes.append(i)
print(primes)
python 第9天
9 dict字典/string
9.1 dict 字典
具有一系列成对对象,一个叫做key,一个叫做value
无顺序,key不能重复。
通过key可以确定唯一一个value
可以添加和删除
key和value 不需要是同类型
key必须不可变
9.2 set
具有一组对象。无顺序,不可重复
可以添加删除
其中元素不需要是同类型,必须是不可变对象
bri = set(['aaa','bbb','ccc'])
bri = {'aaa','ccc','bbb','ddd'} #2.7以后版本
bric = bri.copy()
bric.add('eee')
bric & bri
9.3 string的一些其他方法
- startswith(str) #以str 开头
- endswith(str) # 以str 结尾
- in # 判断是否存在
- find #查找位置
- replace #替换
- upper #大写
- lower #小写
- join #list转string,以规定的符号分割
- split #string转list
delimiter= '_*_'
mylist = ['aaa','bbb','ccc','eee','ddd']
print(delimiter.join(mylist))
print(delimiter.join(mylist).split('_*'))
9.4 练习
使用代码求一下电话号码里面有几个国家:
+86 123241+65 23423+51 23423+30 23423+65 23423+30 23423+86234123
str = '+86 123241+65 23423+51 23423+30 23423+65 23423+30 23423+86 234123'
print(str.split(
python第十天
10 面向对象编程/类成员和对象成员
10.1 面向对象编程
万物皆对象
10.1.1 class
class Person:
pass
p = Person()
10.1.2 方法
class Person:
def say_hi(self):
print("hello, how are you")
p= Person()
p.say_hi()
10.1.3 数据
对象包含的数据,可以用 . 访问。
class Person:
def set_name(self, name):
self.name = name
def say_hi(self):
print("hello, {} ,how are you".format(self.name))
p=Persion()
p.set_name(”shell")
print(p.name)
p.say_hi()
10.1.4 self
python self 代指本身,类似C# 中 this
调用时可以不传递,使用时,需要将self 定义为第一个参数
在函数内使用时,对象的成员使用self.xx的方式
10.1.5 init方法
是对象的第一个方法,用于初始化对象数据
init函数是初始化方法,非构造方法
self对象在init函数被调用之前创建
python中,对象的属性可以自由添加删除,不需要在类里面声明
一般而言,对象里的所有数据都会在init方法中赋值,后面可以变更
10.2 类成员和对象成员
类和对象分别拥有成员,例如数据和方法
对象可以引用类成员(self.say_hi()),也可以引用对象成员(self.name)
当有重名时,有限引用对象成员
类成员在所有对象间共享,而对象成员只是它自己的。
python 第十一天
11 继承/输入输出
11.1 继承
基类、继承类(子类、父类)
子类可以继承父类的成员,当子类和父类定义同名成员时,有限引用子类的
子类拥有父类的所有成员
11.2 输入输出
11.2.1 从命令行输入
input(python3) raw_input(python2)
try:
input= raw_input
except NameError:
pass
11.2.2 从文件中输入输出
使用open打开文件进行读写。 调用方法和c的fopen类似
import sys
poem = '''\
Programming is fun
When the work is done if you wanna make your work also fun:
use Python
'''
f= open('poem.txt','w')
f.write(poem)
f.close()
f = open('poem.txt')
while True:
line = f.readline()
if len(line) ==0:
break
sys.stdout.write(line)
f.close()
以上都是linex命令,因此不能在windows执行
** windows 中对应行为的命令为 dir\ type\ del **
python 第十二天
12 异常、异常处理、常见异常
12.1 异常
python 允许在出现错误的时候,抛出这个错误
错误按顺序一次向上查找,知道第一个合适的处理方法对错误进行处理。
如果无人处理,则会程序崩溃
- 异常输出阅读
异常输出通常和函数的调用顺序相同,和栈的顺序相反。
最上层的调用在最上面,最后执行到的地方在最下面。
最后一行是异常的名字和参数
12.2 异常处理
包含三部分
- 被监管代码体:当其中发生异常时,异常被向上抛出
- 错误类型:当遗产属于定义的这个错误类的子类时,异常处理代码体被调用
- 异常处理代码体:除非明确知道要捕获所有异常,否则演技你使用捕获所有异常来处理某种特定问题
try :
input = raw_input
except NameError:
pass
try:
number = int(input('enter something-->'))
except ValueError:
print("Illegal number")
else:
print(number)
12.4 常见异常
- AttributeError 当出发某个实例时找不到对应的属性方法,
- ImportError 导入的文件找不到
- IndexError 下标超限
- KeyError
- NameError 对象找不到
- SyntaxError
- IndentationError 排版错误,缩进异常, tab 和空格被混用
- TypeError
- ValueError
12.5 抛出异常
def f():
print("i`m ok")
raise exception('actually not')
try:
f()
except Exception as err:
print(err)
12.6 自定义异常
#必须自Exception中继承
class ShortInputException(Exception):
'''A user_defined exception class.'''
def __init__(self,length,atleast):
Exception.__init__(self)
self.length=length
self.atleast = atleast
try:
input = raw_input
except NameError:
pass
12.7 finally
用户无论是否异常,它下面的内容更必然会被执行
多用于清理。(文件的关闭,缓存的清理等)
try:
number = int(input('enter something-->'))
except ValueError:
print("Illegal number")
else:
print(number+1)
finally:
print('(clean up here)')
12.8 with
with 可以在退出区块时自动关闭文件,而且对异常安全。
with不仅可以用于文件,而且可以用于很多需要在离开时自动关闭的对象,如锁
with open("pome.txt") as f:
......
12.9 assert
断言某个事情为真,如果不为真,则抛出异常
assert 1== 0, Exception(' of course')
python 第十三天
13 文档/python2/3的差异
13.1 文档
在线文档
https://docs.python.prg/2/
https://docs.python.org/3/
Library Reference
建议安装时安装本地文档,与安装的版本保持一致,方便查阅。
第三方文档查询 (pypi )
13.2 python2/3 的差异
python2 中的固有的设计问题
- print内置关键词
- 混同了bytes 和 unicode
- / 是整数除法
python3中
- print由关键字改为函数
- 所有字符串默认Unicode
- / 不是整数除法
更多细节差异:https://wiki.python.org/moin/python2orpython3
13.3 python2到3 的迁移
python3 带有2to3脚本。可以完成大部分,但不是全部,需要注意。
python 第十四天
14 第三方软件安装
14.1 setuptools
必须管理员安装
linux :wget https://bootstrap.pypa.io/ez_setup.py -0 - | sudo python
mac :curl https:??bootstrap.pypa.io/ez_setup.py -0 - | python
setuptools 的使用
easy_install 包名
easy_install 安装包路径
在软件的分法宝中找到setup.py 运行 python setup.py install
14.2 pip
pip install 包名
pip install -r requirements.txt
14.3 virtualenv
功能:用于隔离出一套独立的环境,可以在里面安装各种包,而不对系统造成影响
使用场景:可以在用户目录中安装包,无需系统权限。
也可以隔离多个环境,安装不同版本的不同程序
限制:virtualenv本身,一起依赖的python是无法隔离的
14.4 virtualnv的使用
建立环境:virtualenv目录
激活环境:进入目录后执行source bin/activate
退出激活环境:deactivate
隔离环境内的安装:pip或者setup.py 均可
注意:安装时需要编译的,系统中必须由编译工具链
14.5 访问系统库
在使用virtualenv的同时需要使用系统中安装的库,需要在创建环境时用 --system-site-packages 参数
建议:在虚拟环境中在安装一次所有的库
14.6 虚拟环境的发布
使用virtualenv生成的虚拟环境可以迁移到其他机器,
需要注意:
- virtualenv 依赖于目录工作,所以所有机器上virtualenv必须处于同一路径下
- 不能隔离系统/Python基础环境
- 里面所安装的库所依赖的其他系统文件,如果不在virtualenv里面安装,则每个系统上均需要自行安装
14.7 软件包安装和管理建议
python默认情况下会试图将软件安装到系统。
如果不是管理员权限,需要使用virtualenv来安装软件包
Debian/Ubuntu:安装软件第一选择apt系统
RHEL/CentOS:第一训责yum系统。
Windows/MacOS :virtualenv + pip 方式
** virtualenv + pip 均支持以上三种环境的安装 **
python打卡训练营总结
个人背景
- 工作多年的C#程序员
- 曾经0基础写过半年python脚本
- 工作生活中接触过相关大数据及AI智能行业的行情
行业现状
- C# 行情趋于下降,需求量降低,入门门槛较低,竞争大
- python 语言有发展历史,目前是上升阶段
- python 上手容易,精通较难
- 该语言人员较少,从业需求量比较大
学习过程
本次学习时间上刚好处于工作的空闲时间,新旧项目过度时间,使得每天都能有时间跟随视频来学习。每天抽出1小时左右的时间来观看视频,使用markdown编辑器来记录视频知识点,相关脚本代码,也基本都会在python IDLE 中手敲执行,以及使用Jupyter查看动态执行过程中数据的变化,这个工具对深入了解python有很大的帮助。
整个学习过程中,训练营老师的每一次打卡加精,也是我坚持每天记笔记,一直写下来的动力。这也是选择参加训练营一起学习的原因。
收获
这一次的训练营活动,系统的入门并了解python语言基础,了解发展史及对应环境的安装配置,学习了较为基础的相关知识、脚本异常的处理、常用工具的使用。
这些内容,补充了我对于python语言的了解,虽然都是一些基础性知识,比较浅显易懂,但这些都是学习python语言的基石,由浅入深,这之后在接触python 相关的框架项目,就可以快速上手。
python只是一门语言,想要能够解决一些实际问题,还是需要借助其他知识的,比如说数学、线性代数、算法等。
目标
还会继续深入学习python语言,目前考虑是会从着手写一些小工具项目,以实现一些简单业务需求场景为目标,逐步过渡到参与python项目开发。