学习一定要完整课程体系,要在linux下编程
编程技巧 定义函数
先做什么 定义函数
再做什么
最后做什么 要干什么(调用函数)
推动不下去逆着推 输出
先写特殊情况,再加工,如找出特殊,再写循环
规范:
1、类方法第一个参数必须是cls,而静态方法没有“self”和“cls”参数。
类方法是将类本身作为对象进行操作的方法。
-------------------------------------
静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系。静态方法是个独立的、单纯的函
数,它仅仅托管于某个类的名称空间中,便于使用和维护。
2、尽可能使用‘is’‘is not’取代‘==’,比如if x is not None 要优于if x
3、异常中不要使用裸露的except,except后跟具体的exceptions
导入包异常检测;
try:
import twython
except ImportError:
import twython3k as twytho
第一部分:基础语法
字符串的截取的语法格式如下:变量[头下标:尾下标]
str='Runoob'
print(str[0:-1]) # 输出第一个到倒数第二个的所有字符
print(str[0]) # 输出字符串第一个字符
print(str[2:]) # 输出从第三个开始的后的所有字符
print(str * 2) # 输出字符串两次
print(str + '你好') # 连接字符串
print(str[::-1]) #倒序
print('\\\n\\')
print('\\\t\\')
print(r'\\\t\\')
a = 'ABC'
Python解释器干了两件事情:
在内存中创建了一个'ABC'的字符串;
在内存中创建了一个名为a的变量,并把它指向'ABC'。
空行: print(("\n\n按下 enter 键后退出。")) 记住:空行也是程序代码的一部分。
用 ''' ''' 的格式在三引号之间书写较长的注释,打印也能保持原样。
多变量赋值:a, b, c = 1, 2, "runoob"
输出函数解释:
#coding=utf-8
def a():
'''这是文档字符串'''
pass
print(a.__doc__)
字符串输出格式化
1、常规
print ("我叫%s今年%d岁!" % ('小明', 10))
2、常规
print('{}网址: "{}!"'.format('菜鸟教程', 'www.runoob.com'))
3、位置
print('{0} 和 {1}'.format('Google', 'Runoob'))
3、位置
print('{1} 和 {0}'.format('Google', 'Runoob'))
4、变量
print('{name}网址: {site}'.format(name='菜鸟教程', site='www.runoob.com'))
5、位置和变量
print('站点列表 {0}, {1}, 和 {other}。'.format('Google', 'Runoob',other='Taobao'))
print('常量 PI 的值近似为 {0:.3f}。'.format(math.pi))
位置
print('数字 {0} 和 {1} 相加结果为: {2}'.format(1, 2, 3))
-----------------------------------
换行
print("1234567890\n-------") # 一行显示1234567890,另外一行显示-------
/除 %取余 //整除
编码:
计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8(二进制)编码
1byte字节=8bit(11111111)比特 不同编码对应不同字节 A---- ascll 65 --- 二进制01000001
计算机只认ascll码------unicode全世界通用-----utf-8简化unicode----gbk中国
注意事项:
1、命名规范,命名不要和模块冲突 eg: json.py
2、is 用于判断两个变量引用对象是否为同一个(地址都要相同), == 用于判断引用变量的值是否相等
3、pass是空语句,是为了保持程序结构的完整性,不可以省略,不然出错,句末逗号也不能省略。
进阶知识
列表表达式(变量是列表)
li = [1,2,3,4,5,6,7,8,9]
print ([x**2 for x in li])
print ([x**2 for x in li if x>5])
print (dict([(x,x*10) for x in li]))
print ([ (x, y) for x in range(10) if x % 2 if x > 3 for y in range(10) if y > 7 if y != 8 ])
python中字符串的格式
字典
值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。
cities={
'北京':{
'朝阳':['国贸','CBD','天阶','我爱我家','链接地产'],
'海淀':['圆明园','苏州街','中关村','北京大学'],
'昌平':['沙河','南口','小汤山',],
'怀柔':['桃花','梅花','大山'],
'密云':['密云A','密云B','密云C']
},
'河北':{
'石家庄':['石家庄A','石家庄B','石家庄C','石家庄D','石家庄E'],
'张家口':['张家口A','张家口B','张家口C'],
'承德':['承德A','承德B','承德C','承德D']
}
}
for i in cities['北京']:
print(i)
for i in cities['北京']['海淀']:
print(i)
技巧:linux运行pycharm,可以写脚本,直接pycharm运行
$ cd pycharm/bin/
$ ./pycharm.sh
print用法
>> a=10;b=388;c=98
>>> print(a,b,c,sep='@')
10@388@98
#一排显示
a, b = 0, 1
while b < 1000:
print(b, end=',')
a, b = b, a+b
https://blog.csdn.net/qq3401247010/article/details/78155914 ipython
while循环的格式
i = 1
while i<=9: #满足条件,一直循环
j=1
while j<=i:
print("%d*%d=%-2d "%(j,i,i*j),end='') #不换行
j+=1
print('\n') #显示完在换行
i+=1
九九乘法表思路,先打印排数,化繁为简单,print()默认换行,end=‘’组织换行
秘诀:与产品经理与测试搞好关系
小总结:
- continue的作用:用来结束本次循环,紧接着执行下一次的循环,break结束循环
-
python打印各种三角形
条件为假:0, False, '', None 就是if a不成立条件
print([str(round(355/113, i)) for i in range(1, 6)])
['3.1', '3.14', '3.142', '3.1416', '3.14159']
什么情况下需要使用 yield?
一个函数 f,f 返回一个 list,这个 list 是动态计算出来的(不管是数学上的计算还是逻辑上的读取格式化),并且这个 list 会很大(无论是固定很大还是随着输入参数的增大而增大),这个时候,我们希望每次调用这个函数并使用迭代器进行循环的时候一个一个的得到每个 list 元素而不是直接得到一个完整的 list 来节省内存,这个时候 yield 就很有用。
字符串方法 find index count(出现次数 ) replace split切割 capitalize首转大写
title 每个字母大写 startswith endswith lower upper (大小写转换) rfind(从右边找)
rindex join字符串拼接 ,太多,自己去查
>>> a = "abcdef"
>>> a[:3]
'abc'
>>> a[::2]
'ace'
>>> a[5:1:2]
''
>>> a[1:5:2]
'bd'
>>> a[::-2]
'fdb'
>>> a[5:1:-2]
'fd'
实现带下标索引的遍历
for chr in chars:
print("%d %s"%(i, chr)) #自己加i
i += 1
enumerate() 枚举
>>> chars = ['a', 'b', 'c', 'd']
>>> for i, chr in enumerate(chars):
... print i, chr
小总结
- 定义时小括号中的参数,用来接收参数用的,称为 “形参”
- 调用时小括号中的参数,用来传递给函数用的,称为 “实参”
注意:带有默认值的参数一定要位于参数列表的最后面。
用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。用于自定义函数,作为函数内置参数
sum = lambda arg1, arg2: arg1 + arg2
#调用sum函数
print "Value of total : ", sum( 10, 20 )
stus = [
{"name":"zhangsan", "age":18},
{"name":"lisi", "age":19},
{"name":"wangwu", "age":17}
]
按name排序:
>>> stus.sort(key = lambda x:x['name'])
>>> stus
[{'age': 19, 'name': 'lisi'}, {'age': 17, 'name': 'wangwu'}, {'age': 18, 'name': 'zhangsan'}]
按age排序:
>>> stus.sort(key = lambda x:x['age'])
>>> stus
[{'age': 17, 'name': 'wangwu'}, {'age': 18, 'name': 'zhangsan'}, {'age': 19, 'name': 'lisi'}]
包=模块+__init__.py
"增"append, extend, insert
"查"in, not in, index, count
"删"del, pop, remove
排序sort, reverse
集合是一种鲁棒性(健壮性)很好的数据结构,它与数学上的集合概念非常相似。
文件操作 打开关闭 写 注意:如果文件不存在那么创建,如果存在那么就先清空,然后写入数据
#写
with open('test.txt', 'w', encoding='utf-8') as f:
f.write('test')
#读
with open('test.txt', 'r', encoding='utf-8') as f:
f.readlines()
获取文件后缀:
def getfile_fix(filename):
return filename[filename.rfind('.')+1:]
print(getfile_fix('runoob.txt'))
文件夹的相关操作
有些时候,需要对文件进行重命名、删除等一些操作,python的os模块中都有这么功能
os.mkdir("张三")
os.getcwd()
os.listdir("./")
os.rmdir("张三")
应用:批量修改文件名,显示所有视频格式文件,mp4,avi,rmvb……
面向对象
Python3 中类的静态方法、普通方法、类方法
创建对象的格式为:
对象名 = 类名()
- BMW = Car(),这样就产生了一个Car的实例对象,此时也可以通过实例对象BMW来访问属性或者方法
- 第一次使用BMW.color = '黑色'表示给BMW这个对象添加属性,如果后面再次出现BMW.color = xxx表示对属性进行修改
- BMW是一个对象,它拥有属性(数据)和方法(函数)
- 当创建一个对象时,就是用一个模子,来制造一个实物
__init__()
方法是在创建对象后,就立刻被默认调用了
class Car:
def __init__(self, newWheelNum, newColor):
self.wheelNum = newWheelNum
self.color = newColor
def __str__(self):
msg = "嘿。。。我的颜色是" + self.color + "我有" + int(self.wheelNum) + "个轮胎..."
return msg
def move(self):
print('车在跑,目标:夏威夷')
BMW = Car(4, "白色")
print(BMW)
- 在python中方法名如果是
__xxxx__()
的,那么就有特殊的功能,因此叫做“魔法”方法 - 当使用print输出对象的时候,只要自己定义了
__str__(self)
方法,那么就会打印从在这个方法中return的数据
类由名称。属性(数据),方法构成(函数);
有一个对象,当需要对其进行修改属性时,有2种方法
- 对象名.属性名 = 数据 ---->直接修改
- 对象名.方法名() ---->间接修改
为了更好的保存属性安全,即不能随意修改,一般的处理方式为
- 将属性定义为私有属性
- 添加一个可以调用的方法,供调用
class People(object):
def __init__(self, name):
self.__name = name
def getName(self):
return self.__name
def setName(self, newName):
if len(newName) >= 5:
self.__name = newName
else:
print("error:名字长度需要大于或者等于5")
xiaoming = People("dongGe")
print(xiaoming.__name)
总结
- 当有1个变量保存了对象的引用时,此对象的引用计数就会加1
- 当使用del删除变量指向的对象时,如果对象的引用计数不会1,比如3,那么此时只会让这个引用计数减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除
前面加——表示私有属性,私有属性,不能直接修改,用方法去改属性
_del_默认删除,结束前要做的事情,表示回收,节省资源
del引用计数变为0才会结束
多个对象指向同一对象,指向同一地址,相当于这对象有3个别名
通过实例(对象)去修改类属性
class People(object):
country = 'china' #类属性
print(People.country)
p = People()
print(p.country)
p.country = 'japan'
print(p.country) #实例属性会屏蔽掉同名的类属性
print(People.country)
del p.country #删除实例属性
print(p.country)
类方法
是类对象所拥有的方法,需要用修饰器@classmethod
来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls
作为第一个参数,能够通过实例对象和类对象去访问。
class People(object):
country = 'china'
#类方法,用classmethod来进行修饰
@classmethod
def getCountry(cls):
return cls.country
p = People()
print p.getCountry() #可以用过实例对象引用
print People.getCountry() #可以通过类对象引用
多态,方法同一个,现象不同,(对象不同)
类下面有实例方法和类方法(@classmethod),参数cls。类对象可以直接调用类属性。实例对象能获取实例属性,方法。
标准库
只需要简单的功能,应该首先考虑字符串方法,因为它们非常简单,易于阅读和调试:
'tea for too'.replace('too', 'two')
日期和时间
datetime模块为日期和时间处理同时提供了简单和复杂的方法。
支持日期和时间算法的同时,实现的重点放在更有效的处理和格式化输出。
异常捕获:
- 把可能出现问题的代码,放在try中
- 把处理异常的代码,放在except中
#coding=utf-8
try:
print('-----test--1---')
open('123.txt','r') # 如果123.txt文件不存在,那么会产生 IOError 异常
print('-----test--2---')
print(num)# 如果num变量没有定义,那么会产生 NameError 异常
except (IOError,NameError):
#如果想通过一次except捕获到多个异常可以用一个元组的方式
# errorMsg里会保存捕获到的错误信息
print(errorMsg)
- 当捕获多个异常时,可以把要捕获的异常的名字,放到except 后,并使用元组的方式仅进行存储
咱们应该对else并不陌生,在if中,它的作用是当条件不满足时执行的实行;同样在try...except...中也是如此,即如果没有捕获到异常,那么就执行else中的事情
try...finally...语句用来表达这样的情况:
在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等。
小例子:
1、生成日历
import calendar
# 输入指定年月
yy = int(input("输入年份: "))
mm = int(input("输入月份: "))
# 显示日历
print(calendar.month(yy, mm))
2、今天昨天日期
import datetime
def getYesterday():
today = datetime.date.today()
print(today)
oneday = datetime.timedelta(days=1)
yesterday = today - oneday
return yesterday
# 输出
print(getYesterday())