https://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
操作系统:macOS Big Sur (11.6)
Anaconda3:2021.05
python:3.7.3
Jupyter Notebook:5.7.8
还可以在花括号中添加冒号,在冒号之后添加特定的输出格式
保留小数点后三位,f表示浮点数:
列表各个元素的类型无需相同(这一点和Java数组是不同的)
访问列表中的元素,使用方括号+索引(从0开始):
删除列表元素有三种方式:pop、remove、clear
pop()会弹出最后一个元素:
除了sorted,还有一些常用的全局函数和列表有关:
operator(取代原有的cmp),用于比较大小以及是否相等:
要注意的是,只有一个元素的元组也要带逗号,例如(1,),这很好理解,毕竟(1)就是个整数而已
没有括号,只有逗号,也是元组:
字典看起来很像json
items方法返回所有元素,keys返回所有键,values返回所有值:
提到Set,Java程序员应该不陌生,就是咱们经常用来排重的那个Set,是个无序元素集
集合用逗号分隔,大括号包裹:
小结三种包裹方式:列表方括号,元组圆括号,字典和集合大括号(字典的元素是键值对,集合是单个元素),另外元组可以不包裹,有逗号就行
set方法可以将列表转为集合:
集合的元素都是不可变类型的,如数值、字符串、元组
可变类型不能作为集合的元素,如列表、字典、集合,至于其中原因,看看下图红框的错误信息,如果您是个Java程序员,应该get到了:
python不支持switch
if判断的三元操作符,赋值的时候可用if else组合:
格式如下:
[生成表达式 for 变量 in 序列或迭代对象]
测试如下,a就是列表推导式生成的列表:
语法:
import 模块名 [as 别名]
例如导入math模块来计算正弦值:
如果觉得别名也麻烦,能不能把m.也去掉,可以用以下语法:
from 模块名 import 对象名
例如:
假设有一个python文件hello.py,内容如下,定义了名为doHello的方法,再执行一下试试:
def doHello():
print("hello world!")
doHello()
现在另一个文件test.py,里面会调用hello.py中的doHello的方法:
import hello
hello()
执行命令python test.py,结果如下,可见hello world!输出了两次:
will$ python test.py
hello world!
hello world!
上述结果显然不是我们想要的,test.py只是想使用doHello方法,结果将hello.py中的doHello()也执行了,需要一种方式来避免test.py中的doHello()被执行
这时候内置变量name就派上用场了(注意前后都是两个下划线),将hello.py改成如下内容,如果执行python hello.py,内置变量name的值就是main,其他时候,例如hello.py被其他文件import的时候,它的值就是模块名(这里就是hello):
def doHello():
print("hello world!")
if name=='main':
doHello()
再试试python test.py,这次只有一次输出了:
will$ python test.py
hello world!
我们再试试python hello.py,也能按照预期输出:
will$ python hello.py
hello world!
对于Java程序员来说,包很好理解,在python中也很相似,接下来咱们尝试一下,创建名为test的包,里面有两个模块:test1和test2
加入包名为test,咱们创建名为test的文件夹
test文件夹下,新增文件init.py,这是个空文件
创建文件test1.py:
def doTest1():
print("hello test1!")
再创建文件tes2.py:
def doTest2():
print("hello test2!")
现在回到test2.py文件的上一层目录,创建文件hello.py,用来验证如何使用包,可见访问方式是包名.模块名.方法名:
import test.test1 as test1
import test.test2 as test2
test1.doTest1()
test2.doTest2()
运行hello.py试试:
will$ python hello.py
hello test1!
hello test2!
Java程序员对collections包不会陌生,这里面都是一些和容器相关的类,为咱们的开发提供了极大便利,接下来看看该模块常用的几个类
namedtuple:可以用名字访问内容的元组子类,从下面的代码可见,namedtuple可以方便的定义一个对象,很像java中的bean:
from collections import namedtuple
Student = namedtuple('Student', ['name', 'age'])
student = Student('Tom', 11)
print(type(student))
print(student.name)
print(student.age)
执行结果如下,可见student的name和age字段都能方便的访问到,而student实例的类型是class:
will$ python test.py
Tom
11
deque是双向队列,在增加和删除数据的时候比列表的性能更好(列表的读性能更好),基本操作如下所示:
from collections import deque
dq = deque([1,2,3])
dq.append(4)
print('1. {}'.format(dq))
dq.appendleft(5)
print('2. {}'.format(dq))
dq.insert(1, 6)
print('3. {}'.format(dq))
dq.pop()
print('4. {}'.format(dq))
dq.popleft()
print('5. {}'.format(dq))
dq.remove(2)
print('6. {}'.format(dq))
dq.reverse()
print('7. {}'.format(dq))
执行结果如下:
will$ python deque.py
OrderedDict是有顺序的字典,如果您了解LFU(Least frequently used)算法,那么就很容易理解有序的字典了,OrderedDict中的顺序是元素被添加的先后顺序,普通用法如下:
from collections import OrderedDict
od = OrderedDict()
od['a'] = 1
od['c'] = 2
od['b'] = 3
print("1. {}".format(od))
print(od.keys())
od.update({'e':'4'})
print("2. {}".format(od))
od.pop('a')
print("3. {}".format(od))
od.move_to_end('c')
print("4. {}".format(od))
输出如下:
will$ python ordered.py
defaultdict容易理解:带有默认值的字典,用法如下所示,要注意的是defaultdict实例化的入参是lambda表达式,至于这个lambda,相信java程序员并不陌生:
from collections import defaultdict
dd = defaultdict(lambda: 'ABC')
dd['a'] = 1
print(dd['a'])
print(dd['b'])
输出如下:
will$ python defaultdict.py
1
ABC
Counter提供了计数器功能,下面的demo演示了用Counter将列表转为了每个元素的统计结果,要注意的是most_common方法,相当于排序和列表的功能,该方法的返回值是列表,里面的元素是元组:
from collections import Counter
colors = ['aa', 'bb', 'cc', 'aa']
result = Counter(colors)
print(type(result))
print(result)
print(dict(result))
most = result.most_common(2)
print("most_common's type {}".format(type(most)))
print("most_common's value : {}".format(most))
输出结果如下:
will$ python Counter.py
Counter({'aa': 2, 'bb': 1, 'cc': 1})
{'aa': 2, 'bb': 1, 'cc': 1}
most_common's type
most_common's value : [('aa', 2), ('bb', 1)]
基本函数语法:
def 函数名([参数列表]):
函数体
和Java不同的是,函数的入参类型并不固定:
使用关键字pass,可以定义一个空方法:
def test():
pass
一个函数可以返回多个值(本质上是个元组),调用的时候用多个变量来接收即可:
再来看看几个支持lambda的内置函数,熟悉lambda的使用
filter:过滤器,下面是个过滤奇偶数的例子,第一个参数是判断是否过滤的逻辑,True保留,第二个参数是列表,最终奇数全部被剔除,只留下偶数:
与Java不同的是,创建对象不需要关键字new
继承:
class 派生类名 (父类名):
语句…
下面是个继承的例子,Student是父类,Pupil是子类:
class Student:
# 成员变量
name = '未知'
age = 11
__addr= 'ShangHai'
# 构造方法
def __init__(self, name, age, addr):
print('执行构造方法')
self.name = name
self.age = age
self.__addr = addr
def myInfo(self):
print('学生姓名[{}],年龄[{},地址[{}]]'.format(self.name, self.age, self.__addr))
class Pupil(Student):
#成员变量
grade = 1
# 构造方法
def __init__(self, name, age, addr, grade):
# 显式调用父类构造方法
Student.__init__(self, name, age, grade)print('执行构造方法(子类)')
self.grade = grade
# 子类自己的方法
def myGrade(self):
print('学生年级[{}]'.format(self.grade))
执行效果如下,符合预期:
先回顾一下列表推导,下面的代码会生成一个列表:
a = [x*2 for x in range(10)]
如果列表很大就会很占用内存空间,此时我们还有另一个选择:生成器,简单的说就是将上述代码的方括号改成圆括号,这样a就不是列表了,而是生成器,这是种特殊的迭代器:
习惯了java的try-catch-finally,对python的异常处理就容易理解了,捕获和处理如下:
try:
x = 1/0
print('不可能打印这一句')
except ZeroDivisionError as err:
print('发生异常', err)
finally:
print('执行finally')
输出如下图:
微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界…
手机扫一扫
移动阅读更方便
你可能感兴趣的文章