Python人工智能之路 - 第一篇 : 你得会点儿Python基础
Python 号称是最接近人工智能的语言,因为它的动态便捷性和灵活的三方扩展,成就了它在人工智能领域的丰碑
走进Python,靠近人工智能
一.编程语言Python的基础 之 "浅入浅出"不是不给你讲,而是重点在人工智能应用
1.变量
声明变量:
- name = "DragonFire" # 声明一个变量name 用来存储一个字符串"DragonFire"
- age = 20 # 声明一个变量age 用来存储一个数字 20
- print(name, age) # 在控制台打印变量name中存储的字符串 和 变量age中存储的数字 (DragonFire 20)
- print("name", "age") # 在控制台打印字符串"name" 和 "age" (name age)
- # 小练习
- # 在控制台打印 name DragonFire age 20
声明变量
2.控制台交互
- # 打开控制台输入模式,输入提示语为"请输入你的名字>>>" 并将用户输入的信息保存在username变量中
- username = input("请输入你的名字>>>")
- # 在控制台打印变量username所存储的数值
- print(username)
- # 小例子
- username = input("你叫什么名字? >>>")
- print("你好!",username,"我是Python程序")
3.逻辑运算
- # == , != , <= , >= , < , > 逻辑运算符
- print(1 == 1) # 真
- print(1 == 2) # 假
- print(1 != 2) # 真
- print(1 != 1) # 假
- print(1 <= 2) # 真
- print(1 >= 2) # 假
- print(1 < 2) # 真
- print(1 > 2) # 假
- # 思考题
- print(1 == "") # 真 还是 假
- # 与或非
- print(1 == 1 and 2 == 2) # 真 and 真 = 真
- print(1 == 1 and 1 == 2) # 真 and 假 = 假
- print(2 == 1 and 1 == 2) # 假 and 假 = 假
- print(1 == 1 or 2 == 2) # 真 or 真 = 真
- print(1 == 1 or 1 == 2) # 真 or 假 = 真
- print(2 == 1 or 1 == 2) # 假 or 假 = 假
- print(not 1 == 1) # not 真 = 假
- print(not 1 == 2) # not 假 = 真
4.流程控制
- #流程控制 之 if else 判断
- if 1 == 1: # 如果 if 跟随的条件 为 真 那么执行属于 if 中的语句
- print("真的")
- if 1 == 2: # 如果 if 跟随的条件为 假 那么不执行属于if 的语句,然后寻找 else
- print("假的")
- else: # 寻找到 else 之后 执行属于else中的语句
- print("1==2 假的")
- #高端判断 之 否则如果:
- if 1==2:
- print("1==2")
- elif 1==1 : #如果 if 条件不成立,会进行第二次判断 elif ,如果elif条件成立,则执行属于elif中的语句,如不成立则else
- print("1==1")
- else:
- print("全是骗人的")
做一个用户登录小例子:
- # 综合上述知识,我们做个小练习
- username = input("输入用户名:")
- pwd = input("输入密码:")
- if username == "" and pwd == "":
- print("欢迎登陆")
流程控制 之 循环
- # 讲道理它应该是从头到尾的 for 循环
- for i in range(10): # 从0开始循环到9
- print(i)
- #带条件的While 循环,讲道理它根本不会自己停下来
- while 1==1 : # 如果while 的条件成立,则运行属于while中的语句,直到条件不成立为止
- print("你好")
- #劝你不要尝试
主动停止当次或者终止循环
- # 循环中带着判断 , 你好我是continue , Hello 我是 break
- for i in range(10):
- if i == 5: # 当 i 为5 时
- continue # 停止当次循环回到最开始继续循环
- if i == 7: # 当 i 为 7 时
- break # 停止全部循环
- print(i)
- # 打印结果显而易见,不会显示5 当遇到7 的时候不会打印,并且程序结束 也就是 0,1,2,3,4,6
特殊的while循环
- i = 0
- flag = True
- # while循环的停止方式有两种
- while flag :
- i = i + 1
- if i == 5:
- continue
- if i == 7:
- flag = False # 第一种停止方式就是让while 的条件不成立
- if i == 9:
- break # 第二种停止方式就是 break
结合循环,再做一个用户登录的例子:
- # 用户名密码错误,就重复输入到正确为止
- while True:
- username = input("输入用户名:")
- pwd = input("输入密码:")
- if username == "" and pwd == "":
- print("欢迎登陆")
- break
- else:
- continue
5.数据类型
int 整型:不带引号的整数数字,正负都可以取值范围: 32位操作系统 : -2147483648 至 2147483648 64位操作系统: -9223372036854775808 至 9223372036854775807
- num = 1 #声明一个int型变量num 并赋值为 1
- print(type(num)) # 打印变量num的类型
- # <class 'int'> 类型为"int"
float 浮点型 : 不带引号的小数,正负都可以但是长度有限制取值:
- num = 1.2 #声明一个float型变量num 并赋值为 1.2
- print(type(num)) # 打印变量num的类型
- # <class 'float'> 类型为"int"
布尔型 : 也可以叫真假值,就是之前用来判断真假的 True 和 False
- boo = True #声明一个 bool 型变量 boo 并赋值为 True
- print(type(boo)) # 打印变量 boo 的类型
- # <class 'bool'> 类型为"bool"
字符串 : 带引号里面写的基本上都是字符串"这就是个字符串儿"
- string = "Oldboy Edu" #声明一个 string 型变量 str 并赋值为 Oldboy Edu
- print(type(str)) # 打印变量 string 的类型
- # <class 'str'> 类型为"str"
- #字符串类型中的操作:
- #字符串索引:
- print(string[0]) #提取第一个字符
- print(string[-1]) #提取最后一个字符
- #字符串切片
- print(string[0:4]) #提取第一个到第四个字符
- #字符串拼接:
- print("你好 %s"%(string)) # 你好 Oldboy Edu %s 被 string 替换
- #字符串分割:
- print( string.split(" ") ) # 使用空格分割
- #字符串去除空格
- print( string.strip() )
列表 : 被中括号 [] 包裹 , 内部用逗号分隔元素 [1, 2, 3, "4"]
- l = [1, 2, '', ["a", "b"]] # 声明一个 l 型变量 list 并赋值为 [1, 2, '3', ["a", "b"]]
- print(type(l)) # 打印变量 l 的类型
- # <class 'list'> 类型为"list"
- #列表的操作:
- #列表索引:
- print(l[0]) #提取第一个元素
- print(l[-1]) #提取最后一个元素
- #列表切片
- print(l[0:4]) #提取第一个到第四个元素
- #添加元素
- l.append("") # 在列表的尾端插入
- print(l)
- #删除元素
- l.pop(0) #删除第一个元素
- print(l)
- l.remove('') # 删除列表中的某一个元素
- print(l)
- #列表的特殊用途:
- #遍历列表
- for item in l : # 每循环一次,从列表中拿出来一个元素
- print(item)
- #列表包含
- if 2 in l : # 2 in l 返回True 代表 2 存在于 l 中 反之 False
- print(l)
元组 : 和列表几乎一样,只不过把中括号[] 换成了 () 并且 元组不能被修改,也就是不能添加和删除元素
- t = (1, 2, '', ["a", "b"]) # 声明一个 t 型变量 tuple 并赋值为 (1, 2, '3', ["a", "b"])
- print(type(t)) # 打印变量 t 的类型
- # <class 'tuple'> 类型为"tuple"
- #元组的操作:
- #元组索引:
- print(t[0]) #提取第一个元素
- print(t[-1]) #提取最后一个元素
- #元组切片
- print(t[0:4]) #提取第一个到第四个元素
- #元组的特殊用途:
- #遍历列表
- for item in t : # 每循环一次,从元组中拿出来一个元素
- print(item)
- #元组包含
- if 2 in t : # 2 in l 返回True 代表 2 存在于 l 中 反之 False
- print(t)
字典 : 就是键值对的存储,键值对-- k : v 字典{k1:v1,k2:v2} ,key不可重复,且无序
- dic = {"name": "DragonFire", "age": 20} # 声明一个 dict 型变量 dic 并赋值为 {"name": "DragonFire", "age": 20}
- print(type(dic)) # 打印变量 dic 的类型
- # <class 'dict'> 类型为"dict"
- # 取值:
- print(dic["name"]) # 打印 dic 中 name 对应的值
- print(dic.get("name")) # 如果dic中没有name不会抛出异常
- # 修改:
- dic["name"] = "Long"
- print(dic)
- # 增加:
- dic["gender"] = "man"
- print(dic)
- # 删除:
- del dic["gender"]
- print(dic)
- # 字典的特殊用法:
- #循环
- for k,v in dic.items(): # 分别将字典的key和value拿出来
- print(k,v)
集合 : 可以理解为只有Key的字典,不可重复,并且无序
- s = {"name", "DragonFire", "age", 20} # 声明一个 set 型变量 s 并赋值为 {"name", "DragonFire", "age", 20}
- print(type(s)) # 打印变量 dic 的类型
- # <class 'set'> 类型为"set"
- #添加元素
- s.add("")
- print(s)
- #删除元素
- s.remove(20)
- print(s)
- s.pop() #随机删除一个
- print(s)
- # set 是不能通过索引的方式取值的,但是可以通过for遍历的方式取值
- for i in s:
- print(i)
- # set 的特殊用法
- # 求交集
- l = ["name",1,2,20]
- print(s.intersection(l)) # 可以获得交集
二.Python语言的进阶 之 这里学会了Python就会了70%
1.函数 : 你那么聪明根本都不需要看这个章节 之 def args kwargs
- def func(参数1,参数2): # def 用来定义函数及函数名,参数1和参数2就是定义时的形参,也就是将来调用函数时必须要传入的参数
- 变量1 = 参数1+参数2
- return 变量1
如果你看了并且还想点开看的话 + 看了就要记住不然别看
- #我们定义参数的时候,无法确定函数中会有多少参数时,需要可变长参数,也就是动态参数的参与处理 这里我们的*args 和 **kwargs 就起了作用
- *args 就是 将未定义且多余的 位置参数记录在内,偷偷的告诉你,args是个元祖,里面记录着你个函数传递的多余位置参数
- **kwargs 就是 将多余的关键字参数记录在内,我用嘹亮且带有磁性的声音,偷偷告诉你,kwargs 其实是个dict哦,里面大概就是{"name":"Dragon","age":1+1+1+1+1+1+18}
你总是这么变来变去的我都不爱你了 + *args **kwargs
- def args_func(a,b,*args): # args 里面保存着除了ab之外的所有多余参数
- print(args) # 这回知道是元祖了吧
- for i in args:
- print(i)
- args_func(1,2,3,4,5,6) # 这里调用的时候1,2分别传递给a,b,那么3456就会保存在args里面哦
*args 的糖炒栗子
- def kwargs_func(a, b, **kwargs): # kwargs 里面保存着除了ab之外其他关键字传入参的参数
- print(kwargs) # 这回知道是字典了吧
- for k, v in kwargs:
- print(k, v)
- kwargs_func(1, 2, c=3, d=4, e=5) # 这里调用的时候,12分别传递给a,b 那么c=3,d=4,e=5 就会保存在**kwargs里面哦
**kwargs 的 北京怀柔大板栗
- def args_kwargs_func(*args, **kwargs): # 这里一定要注意*args 要在 **kwargs之前
- print(args)
- print(kwargs)
- args_kwargs_func(1, 2, a=1, b=2) # 12存入args a=1,b=2 存入kwargs,这里要注意的是关键字传参之后,不可以在位置传参了
*args **kwargs 的 糖炒北京怀柔大板栗
本节结束,忘记它吧
2.推导而不是推倒 之 推导式
推导式举两个怀柔大板栗:
列表推导式:很(yao)重(xue)要(hui)
- li = [i for i in range(10)] # 简单的列表推导式,就是在列表内写一个for循环对吧
- print(li) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- lis = [i for i in range(10) if i % 2 == 0] # 这是带if 条件的列表推导式
- print(lis) # [0, 2, 4, 6, 8]
超级简单 + 学不会的开启while模式
生成器推导式 : 也(te)很(bie)重要
- gener = (i for i in range(10)) # 简单的生成器推导式,就是在元组内写一个for循环对吧
- print(gener) # <generator object <genexpr> at 0x04F9B3C0>
- geners = (i for i in range(10) if i % 2 == 0) # 这是带if 条件的生成器推导式
- print(geners) # <generator object <genexpr> at 0x04F9B3F0>
别以为我只是复制粘贴的 + 让你一点儿毛病也挑不到
从上述来看,列表推导式和生成器推导式只是[] 与 () 的区别
但是实际上,生成器推导式的效率非常高,但可控性很差,比如不直观,用一次就没了
相对而言列表推导式的效率比较低,但是可控性强,可以反复利用,而且数据显示很直观
本节及本章结束,内容较多,希望大家,都(bi)能(xu)学会
3.模块
import 的用法
字符串字符串字符串 之 json 模块
只要你是个说得上名的数据类型,我全给你弄成字符串,就问你服不服
- import json
- # 我们做一个字典
- dic = {
- "name": "Dragon",
- "age": 20,
- "hobby": ["摩托车", "骑车"],
- "other": {
- "say": "hello",
- "see": "beautiful girl",
- }
- }
- json_dic = json.dumps(dic) # json序列化
- print(type(json_dic), json_dic)
- # <class 'str'> {"name": "Dragon", "age": 20, "hobby": ["\u6469\u6258\u8f66", "\u9a91\u8f66"], "other": {"say": "hello", "see": "beautiful girl"}}
- loads_dic = json.loads(json_dic) # json 反序列化
- print(type(loads_dic), loads_dic)
- # <class 'dict'> {'name': 'Dragon', 'age': 20, 'hobby': ['摩托车', '骑车'], 'other': {'say': 'hello', 'see': 'beautiful girl'}}
一个神奇 json 有了它把一切不可能变为可能
json 用于数据传输上,非常的爽
兄弟就靠你了 之 os 模块
os 模块其实是集成了很多操作系统的方法,比如创建文件夹,拼接路径,删除文件,创建文件等等
- import os
- os.path.join("a","b") # 组合路径 a/b
- os.system("ls") # 执行系统命令
- os.sep() # 获取当前操作系统的路径分隔符
- os.path.dirname(__file__) # 获取当前文件的所在目录
- import os
- os.getcwd() # 获取当前工作目录,即当前python脚本工作的目录路径
- os.chdir("dirname") # 改变当前脚本工作目录;相当于shell下cd
- os.curdir() # 返回当前目录: ('.')
- os.pardir() # 获取当前目录的父目录字符串名:('..')
- os.makedirs('dir1/dir2') # 可生成多层递归目录
- os.removedirs('dirname1') # 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
- os.mkdir('dirname') # 生成单级目录;相当于shell中mkdir dirname
- os.rmdir('dirname') # 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
- os.listdir('dirname') # 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
- os.remove("file_name") # 删除一个文件
- os.rename("oldname", "new") # 重命名文件/目录
- os.stat('path/filename') # 获取文件/目录信息
- os.sep() # 操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
- os.linesep() # 当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
- os.pathsep() # 用于分割文件路径的字符串
- os.name() # 字符串指示当前使用平台。win->'nt'; Linux->'posix'
- os.system("bash command") # 运行shell命令,直接显示
- os.environ() # 获取系统环境变量
- os.path.abspath(path) # 返回path规范化的绝对路径
- os.path.split(path) # 将path分割成目录和文件名二元组返回
- os.path.dirname(path) # 返回path的目录。其实就是os.path.split(path)的第一个元素
- os.path.basename(path) # 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
- os.path.exists(path) # 如果path存在,返回True;如果path不存在,返回False
- os.path.isabs(path) # 如果path是绝对路径,返回True
- os.path.isfile(path) # 如果path是一个存在的文件,返回True。否则返回False
- os.path.isdir(path) # 如果path是一个存在的目录,则返回True。否则返回False
- os.path.join(path1[, path2[, ...]]) # 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
- os.path.getatime(path) # 返回path所指向的文件或者目录的最后存取时间
- os.path.getmtime(path) # 返回path所指向的文件或者目录的最后修改时间
4.文件操作
- f = open("123.txt","rb") #打开文件句柄
- print(f.read()) # 读取文件内容
- f.close() # 关闭文件句柄
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的模式有:
- r ,只读模式【默认】
- w,只写模式【不可读;不存在则创建;存在则清空内容;】
- x, 只写模式【不可读;不存在则创建,存在则报错】
- a, 追加模式【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
- r+, 读写【可读,可写】
- w+,写读【可读,可写】
- x+ ,写读【可读,可写】
- a+, 写读【可读,可写】
"b"表示以字节的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型
- # 文件上下文操作
- with open("123.txt","rb") as f: # 文件句柄f 自动打开关闭文件句柄
- f.read() # 读取文件内容(全部)
- with open("123.txt","rb") as f:
- f.read() #读取文件内容(全部)
- f.readline() # 读取文件中一行文件
- f.readlines() # 读取文件中所有行 ["1","2"]
- f.write("") # 写入文件内容
- f.writelines("") # 写入一行文件
- f.flush()# 刷新文件
- f.seek(10) # 移动光标到10位置
- f.truncate(6) # 从光标当前位置截取6位
- f.tell() # 获取当前光标位置
Python人工智能之路 - 第一篇 : 你得会点儿Python基础的更多相关文章
- PYthon成长之路第一篇(1)__字符串初识
今天一起走进python的代码世界,一起领悟python的魅力 在很多学习python的书中都会以 print “Hello,world!” 这样的而一个程序为开始,那么其中的 hello,worl ...
- Python人工智能之路 - 第二篇 : 算法实在太难了有现成的直接用吧
本节内容 预备资料: 1.FFmpeg: 链接:https://pan.baidu.com/s/1jonSAa_TG2XuaJEy3iTmHg 密码:w6hk 2.baidu-aip: pip ins ...
- python成长之路第一篇(5)文件的基本操作
一.三元运算 我们在上章学习的if,,else,,有一种简便的方法 他的表达式是这样的:变量 = 值1 if 条件 else 值2 解释过来就是如果aaa等于sss则输出值1否则输出值2 二.类的概念 ...
- Python成长之路第一篇(3)_初识字典
经过上章的学习我们已经了解到了列表可以通过索引来获取对应的值,在本章我们将学到通过名字来索引数据,这种结构的类型称之为映射(maooing),在Python中字典是唯一内建的映射类型,其中的值我们称之 ...
- Python成长之路第一篇(4)_if,for,while条件语句
有了以上的基本基础,已经上面写的几个小练习,大家肯定有很多的不满,比如查询为什么查询一次就退出了呢?下面我们来学习条件语句 一.万恶的加号 以前我们在print的时候如果要加上变量都有是使用+来作为连 ...
- Python成长之路第一篇(2)-初识列表和元组
可以将列表和元组当成普通的“数组”,他能保存任意数量任意类型的Python对象,和数组一样都是通过数字0索引访问元素,列表和元组可以存储不同类型的对象,列表和元组有几处重要区别.列表元素用([])包括 ...
- Python成长之路第一篇(2)__初识列表和元组
可以将列表和元组当成普通的“数组”,他能保存任意数量任意类型的Python对象,和数组一样都是通过数字0索引访问元素,列表和元组可以存储不同类型的对象,列表和元组有几处重要区别.列表元素用([])包括 ...
- Python编程笔记(第一篇)Python基础语法
一.python介绍 1.编程语言排行榜 TIOBE榜 TIOBE编程语言排行榜是编程语言流行趋势的一个指标,每月更新,这份排行榜排名基于互联网有经验的程序员.课程和第三方厂商的数量. 2.pytho ...
- .NET持续集成与自动化部署之路第一篇——半天搭建你的Jenkins持续集成与自动化部署系统
.NET持续集成与自动化部署之路第一篇(半天搭建你的Jenkins持续集成与自动化部署系统) 前言 相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛 ...
随机推荐
- Teechart使用记录
一. Chart 1.1 Series 在该界面可以进行曲线的添加.删除.修改 1.2 General 在该界面 Margins 可以设置整个坐标系外边距. 在这里可是设置放大功能. All ...
- VS2013简单的单元测试
安装过程本人在此就不做多余的说明,如果一个程序员连一个软件都无法安装那我也醉了,其次就是希望我们不要为了完成作业而去用VS,下面我具体说一下单元测试. 第一步,文件→新建一个项目,具体操作如下图 打开 ...
- ElasticSearch 2 (31) - 信息聚合系列之时间处理
ElasticSearch 2 (31) - 信息聚合系列之时间处理 摘要 如果说搜索是 Elasticsearch 里最受欢迎的功能,那么按时间创建直方图一定排在第二位.为什么需要使用时间直方图? ...
- QEMU简单知识 以及磁盘格式转换的简单命令
From 百度百科 QEMU,是由 Fabrice Bellard开发的通用.开源机器模拟与虚拟化软件,Fabrice Bellard是另一个著名的C编译器的作者.QEMU可以在不同的机器上运行独自开 ...
- Windows 下 Docker 的简单学习使用过程之一 dockertoolbox
1. Windows 下面运行 Docker 的两个主要工具1): Docker for Windows2): DockerToolbox区别:Docker For Windows 可以理解为是新一代 ...
- c语言和c++有什么区别
差不多是win98跟winXP的关系.C++是在C的基础上增加了新的理论,玩出了新的花样.所以叫C加加. C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输 ...
- BCB将RichEdit光标移到最后一行
int linecount=RichEdit1->Lines->Count; RichEdit1-> SelStart=SendMessage(RichEdit1-> Hand ...
- NESTED最终与外部事务合并在一起提交
NESTED最终与外部事务合并在一起提交
- 【题解】 [HNOI2002]营业额统计 (Splay)
懒得复制,戳我戳我 Solution: \(Splay\)板子题,注意可以选择相等大小 Code: //It is coded by Ning_Mew on 4.10 #include<bits ...
- 【BZOJ1021】[SHOI2008]循环的债务(动态规划)
[BZOJ1021][SHOI2008]循环的债务(动态规划) 题面 BZOJ 洛谷 题解 感觉以前的题目都好小清新啊,我这种智商丢失的选手完全写不动. 这题看着就像一个\(dp\),并且我们发现每种 ...