近来时间较为充足,又因为以前没有系统的学过Python,所以这次就详细的看下相关知识点,扫除下盲点。我本次看的教程是莫烦Python,感觉作者写的很认真很详细,我下面将记录本次学习中发现的盲区,本来比较懒,很多会直接复制,望作者见谅。
传送门:莫烦Python
目录
一、Windows 下安装
二、基础数学运算
三、循环(while、for及内置集合对象)
1 数字
2 None 类型
3 集合类型
4.一个for的例子:
5.range使用
6.内置集合
①tuple:
②dictionary:
③set:
④ 迭代器:
⑤ 生成器:
四、if 判断
①行内表达式:
② if,elif, else的例子:
五、def 函数
1.函数调用与传参
2.函数的可变参数传参
3.函数的关键字参数
六、全局变量
方法:去官网下载自己需要的版本安装即可,主要,需要配置两个环境变量。
一个是python安装路径: E:\software\python\py3.6
一个是为了使用pip配置的:E:\software\python\py3.6\Scripts
环境变量配置方法:点击此电脑-》属性-》高级系统设置-》环境变量-》Path-》添加上面的两个路径(根据自己安装的)。
检验是否安装成功:
在命令窗口测试,打开方式windows键+R,输入cmd,回车。
1.python中平方
两个**
表示,如3的平方为3**2
, **3
表示立方,**4
表示4次方,依次类推。
2.python中%取余,//取整(效果相当于int())。
整数和浮点数也能进行 Boolean
数据操作, 具体规则,如果该值等于 0
或者 0.0
将会返回 False
其余的返回 True.
a = 5
while a:
print(a, end=' ') # 表示输出a之后不使用默认的回车结束,而使用空格
a -= 1
运行结果:
如果 while 后面接着的语句数据类型 None
, 将会返回 False
。
a = None
while a:
print('aaaaaa')
print('----')
运行结果:
在 Python 中集合类型有 list
、 tuple
、dict
和 set
等,如果该集合对象作为 while 判断语句, 如果集合中的元素数量为 0,那么将会返回 False
, 否则返回 True
。
list = range(10)
while list:
print(list[-1], end=',')
list = list[:len(list)-1]
运行结果:
list = range(10)
for i in list:
print(i, end=',')
运行结果:
在 Python 内置了工厂函数,range
函数将会返回一个序列,源码中介绍为:
class range(object):
"""
range(stop) -> range object
range(start, stop[, step]) -> range object
Return an object that produces a sequence of integers from start (inclusive)
to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.
start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.
These are exactly the valid indices for a list of 4 elements.
When step is given, it specifies the increment (or decrement).
"""
三个参数依次表示,区间的第一个数,最后一个数,区间内相邻数间隔(即步长),注意区间为左闭右开(即[start,stop))。
注意:start 默认为0, step 默认为1,同时step可以设置为负数。
a = list(range(10)) # range(stop)
b = list(range(2,10)) # range(start, stop)
c = list(range(2,10,2)) # range(start, stop, step)
print('list_a', a)
print('list_b', b)
print('list_c', c)
运行结果:
Python 共内置了 list
、 tuple
、dict
和 set
四种基本集合,每个 集合对象都能够迭代。
类似数组,但是其值是不能改变的。
test_list1 = ('a', 'b', 'c')
test_list2 = ['x', 'y', 'z']
test_tuple = tuple(test_list2)
# test_list2 可以修改,tuple() 函数不是改变值的类型,而是返回改变类型后的值,原值不会被改变
test_list2[2] = '这是修改的'
# 下面这行报错,元组不可修改
# test_list1[2] = '这是修改的'
print(test_list1)
print(test_list2)
print(test_tuple)
运行结果:
dic = {}
dic['name'] = 'ystraw'
dic['age'] = 18
dic['vertion'] = 3.6
for key in dic:
print(key, dic[key])
运行结果:
注意:字典中 key
是乱序的,也就是说和插入 的顺序是不一致的。如果想要使用顺序一致的字典,请使用 collections
模块 中的 OrderedDict
对象。
跟C++中类似,就是乱序元素的集合,无序且不重复。
s = set(['python', '重复', '重复','python'])
for item in s:
print(item)
运行结果:自动去重了
Python 中的 for
句法实际上实现了设计模式中的迭代器模式 ,所以我们自己也可以按照迭代器的要求自己生成迭代器对象,以便在 for
语句中使用。 只要类中实现了 __iter__
和 next
函数,那么对象就可以在 for
语句中使用。 现在创建 Fibonacci 迭代器对象。
class Fib(object):
def __init__(self, max):
self.max = max
self.n, self.a, self.b = 0, 0, 1
def __iter__(self):
return self
def __next__(self):
if self.n < self.max:
r = self.b
self.a, self.b = self.b, self.a + self.b
self.n = self.n + 1
return r
raise StopIteration()
# using Fib object
for i in Fib(5):
print(i, end=',')
运行结果:
除了使用迭代器以外,Python 使用 yield
关键字也能实现类似迭代的效果,yield
语句每次 执行时,立即返回结果给上层调用者,而当前的状态仍然保留,以便迭代器下一次循环调用。这样做的 好处是在于节约硬件资源,在需要的时候才会执行,并且每次只执行一次。
def fib(max):
a, b = 0, 1
while max:
r = b
a, b = b, a+b
max -= 1
yield r
# using generator
for i in fib(5):
print(i, end=',')
print()
print(fib(5))
print(type(fib(5)))
运行结果:fib(5)调用函数时,函数内循环执行 yield, 每次执行时,会将 r值即上一步的b值返回调用者,并构成一个迭代对象。
类型与C中的三目运算符,condition ? value1 : value2 ,在Python中可以用行内表达式达到同样的效果。
var = var1 if condition else var2
如果 condition
的值为 True
, 那么将 var1
的值赋给 var
;如果为 False
则将 var2
的值赋给 var
。
b = 3
a = 1 if b > 3 else 0 # 行内表达式, 类似于C中的三目运算符:condition ? value1 : value2
print(a) # out: 0
a = 1 if b >= 3 else 0
print(a) # out: 1
x = -4
if x > 1:
print ('x > 1')
elif x < 1:
print('x < 1')
else:
print('x = 1')
print('finish')
运行结果:
一般按照函数写的顺序传递参数,如果不按顺序则可以写上参数名。
# 测试函数
def test(a, b=0, c=1): # b,c都设置了默认参数,可以缺少。
print('a=', a, ',b=', b, ',c=', c)
# 调用函数
test(1)
test(1, 2, 3)
test(1, c=3, b=2) # 指明参数名后,顺序可以变
test(0, c=2) # a没有默认参数,必须传参
运行结果:
注意:默认参数只能从右往左连续给出,即所有的默认参数都不能出现在非默认参数的前面;没有默认值的参数必须传递,否则报错。
函数的可变参数是传入的参数可以变化的,1个,2个到任意个。注意可变参数在函数定义不能出现在特定参数和默认参数前面,因为可变参数会吞噬掉这些参数。
def report(name, *grades):
total_grade = 0
for grade in grades:
total_grade += grade
print(name, 'total grade is ', total_grade)
report('小明', 60, 70)
report('小明', 60, 70, 80)
运行结果:
小明 total grade is 130
小明 total grade is 210
关键字参数可以传入0个或者任意个含参数名的参数,这些参数名在函数定义中并没有出现,这些参数在函数内部自动封装成一个字典(dict).
def portrait(name, **kw):
print('name is', name)
for k,v in kw.items():
print(k, v, end=' ')
print('\n---------')
portrait('小明', math='90', Chinese=88)
portrait('小明', math='90', Chinese=88, music=77)
运行结果:
name is 小明
math 90 Chinese 88
---------
name is 小明
math 90 Chinese 88 music 77
---------
注意:
通过可变参数和关键字参数,任何函数都可以用 universal_func(*args, **kw)
表达。
那如何在外部也能调用一个在局部里修改了的全局变量呢. 首先我们在外部定义一个全局变量 a=None
, 然后再 fun()
中声明 这个 a
是来自外部的 a
. 声明方式就是 global a
. 然后对这个外部的 a
修改后, 修改的效果会被施加到外部的 a
上. 所以我们将能看到运行完 fun()
, a
的值从 None
变成了 20
.
APPLE= 100 # 全局变量
a = None
def fun():
global a # 使用之前在全局里定义的 a
a = 20 # 现在的 a 是全局变量了
return a+100
print(APPLE) # 100
print('a past:', a) # None
fun()
print('a now:', a) # 20
运行结果:
100
a past: None
a now: 20