从零开始的人工智能学习(二)

    终于放假了。。。上个星期一直在考试和备考,所以就托更啦。接下来的文本里面的东西,到后面还是比较难懂的,所以也花了比较久的时间。后面两章基本上没看懂,所以暂且放一放,先把书上的语法给看完。这一周主要看的就是接上上一次的内容,然后是控制流和块处理,最后是函数的一小部分。还有一些上一次遗留的问题。

#新建关键字,当关键字不存在时新建,存在时则保有原值
filled_dict.setdefault("five",5)
print(filled_dict)
filled_dict.setdefault("five",6)
print(filled_dict)
print()
#下面设置集合,可能有点像列表,但他可以避免设置相同的副本
#设置一个空集合
empty_set = set()
#初始化一个数字集合,里面存在两个相同的副本‘2’
some_set = set([1,2,2,3,4])
print(some_set)# =>{1,2,3,4}
#初始化一个无序集合,集合不能保证顺序,即使有时他看起来是有序的
another_set = set([7,2,5,6])
print(another_set)# =>{2,5,6,7}
add_another_set = set("apple")
print(add_another_set)# =>{'p','e','l','a'}
#自py2.7开始,花括号{}可以用来声明集合
filled_set = {1,2,2,3,4}
print(filled_set)# =>{1,2,3,4}
#在集合中添加一个成员
filled_set.add(5)
print(filled_set)# =>{1,2,3,4,5}
#求交集
other_set = {3,4,5,6}
print(filled_set & other_set)
# =>{3,4,5}
#求并集
print(filled_set | other_set)
# =>{1,2,3,4,5,6}
#求后集合对前集合的补集
print(filled_set - other_set)
# =>{1,2}
#求两集合非交集合
print(filled_set ^ other_set)
# =>{1,2,6}
#查询包含关系
print({1,2} >= {1,2,3})# =>False
print({1,2} <= {1,2,3})# =>True
#查询成员是否存在
print(2 in filled_set)# =>True
print(10 in filled_set)# =>False
print(10 not in filled_set)# =>True
#查询类型
print(type(li))# =>list
print(type(filled_dict))# =>dict
print(type(5))# =>int
print(type('i'))# =>str
print(type(filled_set))# =>set
#这一部分讲控制流,这和c语言非常相似,只要少许的不同
#先创建一个变量
some_var = 5
#现在要用if循环语句,注意书写规范
#程序凹凸有致对python很重要(对其他语言也一样,提高可读性)
if some_var > 10:
    print ("some_var is totally bigger than 10.")
elif some_var < 10:
    print ("some_var is smaller than 10.")
else:
    print ("some_var is indeed 10.")
#这和c语言很像,但要注意':'是英文输入法的,使用中文输入法会报错
#文本中虽然没有给print打括号,但是程序中依旧要打才能pass
'''该段输出 =>
some_var is smaller than 10.'''
print()
#用for循环遍历列表,然后输出语句
#使用{0}插入格式化语句
for animal in ["dog","cat","mouse"]:
    print("{0} is a mammal".format(animal))
'''该段输出 =>
dog is a mammal
cat is a mammal
mouse is a mammal'''
print()
#"range(num)"返回从0到num的数字列表,不包括num
for i in range(4):
    print(i)
'''该段输出 =>
    0
    1
    2
    3
'''
print()
#"range(lower,upper)"返回从极小值到极大值的数字列表,当然也不包含极大值
for i in range(4,8):
    print(i)
'''该段输出 =>
    4
    5
    6
    7
'''
print()
#while语句执行语句直到不再满足条件为止
x = 0
while x < 4:
    print(x)
    x += 1
'''该段输出 =>
    0
    1
    2
    3
'''
print()
#用try和except块处理异常,python2.6及以上
try:#使用raise引发一个错误
    raise  IndexError("This is an index error")
except IndexError as e:
    pass#pass只是一个停止操作指令,通常我们会在这里恢复
except(TypeError,NameError):
    pass#如果需要,可以一起处理多个异常
else:#try/except块的可选子句。必须跟在所有块之后 
    print("All good!")#仅当try中的代码未发生异常时运行
finally:#在任何情况下执行
    print("We can clean up resources here")
'''以上输出We can clean up resources here'''
#以上时文本资料,讲述的有点笼统,反正一开始看我是没看懂
#所以我在一些大佬的博客里参悟学习了一下,具体参考
#https://www.cnblogs.com/Lival/p/6203111.html
#主要意思就是,跑python的时候,一旦遇到一些异常,程序就会终止
#异常之后的代码就不会继续运行,而异常处理try…except,raise就是用来解决这个问题的
#try…except:
a = 10
b = 0
try:
    c = a / b#除数不能作为分母,这时候程序会报错
    print(c)
except ZeroDivisionError as e:#原本的报错交给except块进行处理
    print(e)
print("done")#该语句正常执行
'''运行结果为:
division by zero
done'''
#这样程序就不会因为异常中断
#try…except…else
#当没有异常发生的时候,else中的语句将会被执行
a = 10
b = 0
try:
    c = b / a#该语句正常
    print(c)
except (IOError,ZeroDivisionError) as x:#同时处理文件操作异常和0的运算错误
    print(x)
else:
    print("no error")#由于try语句正常,该语句正常打印
'''该段输出
0.0
no error'''
#下面是发生异常时的状况
try:
    c = a / b
    print(c)
except (IOError,ZeroDivisionError) as x:
    print(x)
else:
    print("no error")#try发生异常,else不执行
'''该段输出
division by zero'''
#有没有else其实差不多,写在try里也是一样的
try:
    c = a / b
    print(c)
    print("no error")#以上语句发生异常,该语句跳过
except (IOError,ZeroDivisionError) as x:
    print(x)
'''该段输出
division by zero'''
#raise我提供的那个博客可能由于版本原因,提供的例子是行不通的
#因为通过input输入的东西都属于字符型,所以我们修改一下程序
'''x = input("please input a number:")
if x.isdigit():
    print(x)
else:
    raise ValueError'''
#当x不全为数字时,则引发一个错误
#输入1.2时,发生异常
#输入1时,输出1
print()#对于with的那一段,原来我着实没看懂,you jump,i jump
#函数
#使用def创建一个新的函数
def add(x, y):
    print("x is {0} and y is {1}".format(x, y))
    return x + y
print(add(4, 5))
'''该段输出:
x is 4 and y is 5 
9'''
#定义函数方式和c略有不同,但使用方法却是一样的
#x,y为形参,而4,5为实参,函数通过形参来传递实参
#不同的是,形参和实参不一定一一对应位置,但要求输入形参
print(add(y = 6,x = 5))
'''该段输出:
x is 5 and y is 6
11'''
#一样行得通
#也可以定义位置参数个数未定的函数,使用*号将其解释为元组
def varargs(*args):
    return args
print(varargs(1,2,3))# =>(1, 2, 3)
#也可以定义关键词参数个数未定的函数,使用**号将其解释为字典
def keyword_args(**kwargs):
    return kwargs
print(keyword_args(big="foot",loch="ness"))
# =>{'big': 'foot', 'loch': 'ness'}
#当然,也可以同时包含着两种参数
def all_the_args(*args, **kwargs):
    print(args)
    print(kwargs)
all_the_args(1, 2, a=3, b=4)
'''该段输出:
(1, 2)
{'a': 3, 'b': 4}'''
#反过来,我们也可以将形参传递给函数
args = (1, 2, 3, 4)
kwargs = {"a": 3, "b": 4}
all_the_args(*args)
'''该段输出:
(1, 2, 3, 4)
{}'''
all_the_args(**kwargs)
'''该段输出:
()
{'a': 3, 'b': 4}'''
all_the_args(*args, **kwargs)
'''该段输出
(1, 2, 3, 4)
{'a': 3, 'b': 4}'''
print()
#你可以传递args和kwargs这两个形参
#给其他接受同类型的参数的函数
#和c不一样的是,在调用函数的时候需要分别通过*号和**号展开他们
def pass_all_the_args(*args, **kwargs):
    all_the_args(*args, **kwargs)
    print(varargs(*args))
    print(keyword_args(**kwargs))
pass_all_the_args(*args, **kwargs)
#函数通过*号和**号识别元组和字典
'''该段输出:
(1, 2, 3, 4)
{'a': 3, 'b': 4}
(1, 2, 3, 4)
{'a': 3, 'b': 4}'''
print()
x = 5
def set_x(num):
    x = num#跟c一样,这里的x为函数内部的x
    print(x)# =>43
def set_global_x(num):
    global x#声明x为全局变量,此时x为函数外部的x
    print(x)# =>5
    x = num
    print(x)# =>6
set_x(43)
set_global_x(6)
print()
#python独有的功能(我猜是这样翻译的)
def create_adder(x):
    def adder(y):
        return x + y

    return adder

add_10 = create_adder(10)
print(add_10(3))# =>13
#这样也可以
print(create_adder(10)(3))# =>13
#这里定义匿名函数
print((lambda x: x > 2)(3))# =>True
#lambda本身是一个函数,它能将自身赋给一个变量
#那么使用变量名的同时,便可以通过其调用lambda的语句
#跟直接定义一个函数差不多,但还有其他更神奇的用法
#下面的语句和上面的类似
compare = lambda x: x > 2
print(compare(3))# =>True
#下面讲高阶函数,高阶函数要求参数中包含函数
#map高阶函数,在python3里,map的返回值已经不是list(列表),而是iterators(迭代器)
print(map(add_10, [1, 2, 3]))# =><map object at 0x00000226516557F0>
#所以在这里需要转换类型
print(list(map(add_10, [1, 2, 3])))# =>[11, 12, 13]
#下面的max寻找每一组数中的最大值
print(list(map(max, [1, 2, 3], [4, 2, 1])))# =>[4, 2, 3]
#filter函数用于过滤序列,过滤掉不符合条件的元素,并组成一个新的列表
print(list(filter(lambda x: x > 5, [3, 4, 5, 6, 7])))# =>[6, 7]
#可以用列表([])更好的理解maps和filters,下面的只要有一定的英语水平,估计都能读得懂
#对于列表中的每一个数,分别调用上面声明的add_10函数,将结果搭建成一个新列表
print([add_10(i) for i in [1, 2, 3]])# =>[11, 12, 13]
#就列表中的每一个数,分别进行条件判断,输出符合条件的数,搭建一个新列表
print([x for x in [3, 4, 5, 6, 7] if x > 5])# =>[6, 7]
#也可以通过构造集合和字典({})来理解
#对0到5的数,分别进行**运算,将结果作为字典输出
print({x: x ** 2 for x in range(5)})# =>{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
#寻找字符串中包含于另一字符串的字符,将符合条件的字符,作为集合输出
print({x for x in 'abcddeef' if x in 'abc'})# =>{'a', 'c', 'b'}

说实在的,文章里讲的内容实在是快,没有学过一门语言的人接触起来可能会有点吃力,我也查找了很多很多的资料,才把一些函数和语法的意思弄懂。with和类那一块完全没有接触过,结果就吃瘪了,然后现在在菜鸟教程上恶补。有关python的一些小研究另外发一个。

和以往一样,希望大家能提出我的错误,包括中文翻译和自我理解的部分。谢谢!

猜你喜欢

转载自blog.csdn.net/qq_43316108/article/details/86546045