赞
踩
环境:
基础六大数据类型,可以使用 type()
查看,如下图:
支持
可以用单引号或双引号声明,也可以使用 三个 单引号或双引号声明
有序的可变列表
有序的不可变序列,可有序记录一堆不可变的Python数据集合
无序不重复结合
可无序记录一堆不重复的Python数据集合
无序Key-Value集合
可无序记录一堆Key-Value型的Python数据集合
可以将任意类型转为字符串,如:数字/字符串/列表/元组/集合/字典 => 字符串,如下图:
但字符串并不能转到任意其他类型,因为字符串本质是一个字符列表,下面看转换的效果:
其他的转换,如:int <=>float吗,需要注意:float转int会有精度丢失(注意是精度丢失,不是四舍五入),看下图:
元组转列表:
python是脚本语言,弱类型,所以一个变量可以随便赋其他的值,甚至变更数据类型,这点和javascript
类似。
另外,python中不用定义变量,直接使用即可,如下:
常见运算符 :+
加法,-
减法,*
乘法,/
除法,//
整除,%
取余,**
指数
下面列出重点关注的几项:
' abc'
"abc"
"""abc"""
或 '''abc'''
特点总结:
"""abc"""
或 '''abc'''
,就可以让我们省去表示换行符合\的苦恼,看下面对比效果:"""abc"""
和 '''abc'''
的开头和结尾不想有换行的话,要紧贴这写,否则会产生换行符,如下:使用 +
可进行拼接,但不同于其他语言,我们不能将字符串和其他类型(如:int)进行相加,如下:
javascript是允许的,这点得注意下:
上面使用+
对字符串拼接简单的还行,当相加内容很多的话就不易读了,而且还不支持其他数据类型(比如: int/float)自动转字符串,所以就有了下面两种字符串格式化方法:
下面是效果:
可以使用input(prompt)
获取用户控制台的输入,回车后,用户输入的字符串
就传到了程序中,如下:
python中的for循环没有 for(int x=0;x<10;x++)
这种格式,只有: for x in li:
这种,如下:
这种方式,是没办法这循环体中获取当前进度的,但我们可以借助range
range
函数本身是生成一个范围,格式为:range(start,end,step)
注意:包含start,不包含end,看下面的示例:
那么,组合range
和for
循环如下:
直接看下面的使用示例:
返回的None
可以用于if
判断中,表示False
return
和return None
是一样的。
另外,python中的函数还有一些特点,如:
直接看示例:
不定长参数示例:
python中的list类似javascript
中的数组, c#
中的list,常见操作如下:
len(li)
li[index]
for x in li:
li.index(ele)
li.insert(index,ele)
li.apped(ele)
li.extend(li2)
li.remove(ele)
dele li[index]
delEle=li.pop()
li.clear()
li.count(ele)
li.sort(key=lambda: x: x"age"], reverse=True)
[1,2]+[3,4] //out: [1, 2, 3, 4]
[1,2]*3 //out: [1, 2, 1, 2, 1, 2]
3 in [1,2,3] //out: True
map(lambda, list)
、filter(lambda, list)
、reduce(lambda, list)
n_list=[x **2 for x in range(10) if x %2 ==0]
看下面的示例:
# 插入到指定位置 print() print("------li.insert()-------") li = ["刘备", "关羽", "张飞"] li.insert(0, '曹操') print(f'["刘备", "关羽", "张飞"].insert(0,"曹操")=> {li}') # 追加元素 print() print("--------append()------") li = ["刘备", "关羽", "张飞"] li.append("孔明") print(f'["刘备", "关羽", "张飞"].append("孔明")=> {li}') # 追加另一个容器 print() print("--------extend()------") li = ["刘备", "关羽", "张飞"] li.extend(["孙策", "孙权"]) print(f'["刘备", "关羽", "张飞"].append(["孙策", "孙权"])=> {li}') # 移除指定元素 print() print("--------remove(): 只移除第一个------") li = ["刘备", "关羽", "张飞", "关羽"] li.remove('关羽') print(f'["刘备", "关羽", "张飞","关羽"].remove("关羽")=> {li}') # 根据下标移除 print() print("--------del list[index]: 根据下标移除------") li = ["刘备", "关羽", "张飞"] del li[1] print(f'["刘备", "关羽", "张飞"] del li[1]=> {li}') # 从末尾移除一个 print() print("--------pop(): 从末尾弹出一个------") li = ["刘备", "关羽", "张飞"] ele = li.pop() print(f'["刘备", "关羽", "张飞"].pop()=> {li}, ele={ele}') # 清空列表 print() print("--------clear(): 清空列表------") li = ["刘备", "关羽", "张飞"] li.clear() print(f'["刘备", "关羽", "张飞"].clear()=> {li}') # 获取列表长度 print() print("--------len(li): 获取列表长度------") li = ["刘备", "关羽", "张飞"] count = len(li) print(f'len(["刘备", "关羽", "张飞"])=> {count}') # 统计列表元素数量 print() print("--------count(ele): 统计列表某个元素数量------") li = ["刘备", "关羽", "张飞", "关羽"] count = li.count("关羽") print(f'["刘备", "关羽", "张飞","关羽"].count("关羽")=> {count}') # 列表排序 print() print("--------sort(): 列表排序------") li = ["a", "c", "b"] li.sort() print(f'["a","c","b"].sort()=> {li}') li = ["a", "c", "b"] li.sort(reverse=True) print(f'["a","c","b"].sort(reverse=True)=> {li}') li = [{"name": "小明", "age": 18}, {"name": "小花", "age": 16}, {"name": "小刚", "age": 20}] li.sort(key=lambda x: x["age"], reverse=True) print(f'[dict1,dict2,dict3].sort(key=lambda x: x["age"])=> {li}') """ 输出如下: PS D:\jackletter\pylearn> py .\15.py ------li.insert()------- ["刘备", "关羽", "张飞"].insert(0,"曹操")=> ['曹操', '刘备', '关羽', '张飞'] --------append()------ ["刘备", "关羽", "张飞"].append("孔明")=> ['刘备', '关羽', '张飞', '孔明'] --------extend()------ ["刘备", "关羽", "张飞"].append(["孙策", "孙权"])=> ['刘备', '关羽', '张飞', '孙策', '孙权'] --------remove(): 只移除第一个------ ["刘备", "关羽", "张飞","关羽"].remove("关羽")=> ['刘备', '张飞', '关羽'] --------del list[index]: 根据下标移除------ ["刘备", "关羽", "张飞"] del li[1]=> ['刘备', '张飞'] --------pop(): 从末尾弹出一个------ ["刘备", "关羽", "张飞"].pop()=> ['刘备', '关羽'], ele=张飞 --------clear(): 清空列表------ ["刘备", "关羽", "张飞"].clear()=> [] --------len(li): 获取列表长度------ len(["刘备", "关羽", "张飞"])=> 3 --------count(ele): 统计列表某个元素数量------ ["刘备", "关羽", "张飞","关羽"].count("关羽")=> 2 --------sort(): 列表排序------ ["a","c","b"].sort()=> ['a', 'b', 'c'] ["a","c","b"].sort(reverse=True)=> ['c', 'b', 'a'] [dict1,dict2,dict3].sort(key=lambda x: x["age"])=> [{'name': '小刚', 'age': 20}, {'name': '小明', 'age': 18}, {'name': '小花', 'age': 16}] PS D:\jackletter\pylearn> """
简单的升序:
简单的降序:
指定排序的key:
其实类似c#中的List<List<T>>
嵌套,但不同于c中的 int[i,j]
filter:
map:
reduce:
多维嵌套的列表推导式:
python中除了list
还有tuple
,元组是只读的,所以没有增删改等操作。
直接看下面:
因为元组是按顺序存储,所以支持按照索引访问,同时支持for循环,如下:
这个和list的用法类似,如下:
元组推导式不同于列表/字典/集合的明显一点是,推导式的结果是一个生成器,而不是元组对象,我们需要使用 tuple 函数转换:
字符串可以看做是字符的只读容器,类似list
列表(list)、元组(tuple)、字符串(str) 这三个都是序列,它们支持切片操作。
切片的语法为:seq[start:end:step]
,其中,start/end/step的默认值分别为:0/len(seq)/1
,另,当 step
是为负值时,start/end默认是: -1/-(len+1)
下面以列表为例,看下它的效果:
li = [0, 1, 2, 3, 4, 5] # 正常取 print(li[1:5:2]) # [1, 3] # 拷贝 同 li[:] print(li[:]) # [0, 1, 2, 3, 4, 5] print(li[::]) # [0, 1, 2, 3, 4, 5] # 反转 当step为负值时,start/step默认值是: -1/-(len+1) print(li[::-1]) # [5, 4, 3, 2, 1, 0] # 终点在起点前面,而步长是1,肯定取不到 print(li[4:2]) # [] # 终点起点超出, 取不到 但不会报错 print(li[100:120]) # [] # 相当于 li[5:1] 但步长不对,取不出 print(li[5:-5]) # [] # 相当于 li[5:1:-1] 倒叙取出 print(li[5:-5:-1]) # [5, 4, 3, 2] # 连续切片 print(li[:4][1:3][-1:]) # 2 # 解释 print(li[:4]) # [0, 1, 2, 3] print(li[:4][1:3]) # [1, 2] # 截取末尾2个 print(li[-3:-1]) # [3, 4]
对元组和字符串也是一样的,如下:
集合相对于列表、元组、字符串的特点是:无序且唯一。
因为无序自然不能用下标访问,也不能用于切片。
唯一是集合自动去重的。
se.add(ele)
se.remove(ele)
/ ele = se.pop()
se.clear()
如下图:
还有集合运算
se & se2
se | se2
se - se2
se ^ se2
如下图:
还有集合运算后将结果覆盖第一个集合的,如:
se.intersection_update(se2)
se.difference_update(se2)
不再实验
集合和字典的推导式写法一致, 不同点在于生成的目标是字典还是集合。
下面的是集合推导式:
下面的是字典推导式:
下面的是列表推导式:
python中的字典和javascript
的对象一个意思,直接看下面的示例:
字典的定义:
注意:我们如果 dic[key]
如果不存在的话会报错,但我们可以使用 dic.get(key)
,当然我们也可以使用__contains__
去判断,如下:
交换字典的kv:
根据字典的v过滤:
文件模式:
r
只读
w
:存在则覆盖,不存在则新建
a
:存在则追加,不存在则新建追加
简单的写入和读写示例:
我们也可以指定读取的字符数(注意:不是字节数)或读取一行,如下(还是用上面创建的txt):
我们也可以使用for循环读取,另外,我们可以使用with
关键字以防止忘记写close()
直接看下面的示例:
print("------捕获异常---") try: i = 5/0 except Exception as ex: print(type(ex), ex) print() print("------捕获异常---") try: dic = {"age": 18} i = dic["name"] except Exception as ex: print(type(ex), ex) print() print("------捕获异常---") try: i = 5/0 except: print("异常了") print() print("-------捕获多种异常--------") try: i = 5/0 except (KeyError, ZeroDivisionError) as ex: print(type(ex), ex) print() print("------finally-------") try: i = 5/0 except: print("异常了") finally: print("finally执行了") print() print("--------自己引发异常-------") try: raise Exception("测试手动抛异常") except Exception as ex: print(ex)
输出如下:
概念:在python中简单理解,一个文件就是一个模块
导入模块的语法:
[from 模块名] import [ 模块 | 类 | 变量 | 函数 | * ] [as 别名]
常用形式:
import 模块名
from 模块名 import 类、变量、方法等
from 模块名 import *
import 模块名 as 别名
from 模块名 import 功能名 as 别名
看一个简单的示例(导入系统提供的):
我们可以自定义模块,然后导入,如下:
# 路径: /cc/c_28.py # 默认定义的都可以被导出, 可以使用 __all__指定仅导出哪些,但仅限定在 import * __all__ = ["funcSub"] def funcSub(x, y): return x-y print() print("-------------") print(f"__file__:{__file__}") print(f"__name__:{__name__}") if (__name__ == "__main__"): print(f"直接运行脚本: {__file__}") else: print(f"导入了脚本: {__file__}")
# 路径: /pp/test.py
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
from cc.c_28 import funcSub
print()
print("-----------")
print(f"funcSub(1, 2)=>{funcSub(1, 2)}")
运行如下:
上面有几点需要注意下:
__name__
可以用来判断当前模块是被导入的还是直接运行的__all__
可以用来限制导入时(import *) 只能导入指定的模块(注意,只有在 import * 时有效)sys.path.append(xx)
将指定的路径加入到模块搜索中去在python中包其实就是一个文件夹,里面可以放许多的模块(代码文件),通过包进行归类,方便管理。
但python包和普通文件夹又有区别:包下面有一个 __init__.py
文件来标识这是一个包,通常会在这个文件中使用`all``来限制导出的内容。
如:
类似 java中的maven
,javascript
中的npm
,python
中也有pip
管理包的程序。
我们可以通过它方便的引用三方包,如下:
我们可以先通过命令查看配置:
来解释下:
pip config list
显示所有的配置,当前已设置了国内源,如果没有的话可以参考:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip config set install.trusted-host pypi.tuna.tsinghua.edu.cn
其他常用的源还有:
1、华南理工大学镜像源
http://pypi.hustunique.com/simple/%29
2、清华大学
https://pypi.tuna.tsinghua.edu.cn/simple
3、豆瓣
http://pypi.douban.com/simple/
4、清华大学开源镜像站
https://mirrors.tuna.tsinghua.edu.cn/
5、网易开源
http://mirrors.163.com/
6、华为
https://mirrors.huaweicloud.com/
7、阿里巴巴
https://opsx.alibaba.com/mirror/
pip list
显示当前安装的三方包
可以看到,当前我安装了一个 numpy
,另外两个是自带的,安装命令为:
pip install aliyun-python-sdk-core==2.13.36
(也可以不指定版本)
如下:
python
和 java
、c#
这种语言不一样:
java
和c#
都是静态语言,安装的都是别人编译好的包,它们可以将一个包的各个版本缓存起来,然后加入到项目的引用即可;python
是解释性语言,安装的都是源码,没有将包的某个版本加入到项目引用
这种说法,所以管理起来就麻烦很多;javascript
也是解释性语言,它也有同样的问题,不过npm
是将本项目引用的包都放在node_moudules
文件夹下面。缺点就是每个新项目都得重新下,即使我们用的是xxxx包的同一个版本。
python
为了解决这个问题,提出了虚拟环境的概念,就是将python
拷贝一份作为新的环境,这样我们在新的环境里安装包不会影响其他环境里的,做到了隔离。比如:
我们先选择一个目录,如 D:\jackletter\my-venv
,然后执行如下:py -m venv my-venv
执行完成后,看看里面的东西:
我们需要激活这个环境,如下:
.\Scripts\Activate.ps1
其实激活就是将my-venv
的路径配置到path里面,如下:
在虚拟环境里,我们安装的包都在 my-venv\Lib\site-packages
下,如下:
退出虚拟环境的命令是:.\Scripts\deactivate.bat
,不过在powershell中不好用。。。但在cmd里是可以的。。。
requirements.txt可以记录当前项目依赖的包版本,这package.json中的dependency作用是一样的,格式如下:
如果,一个项目目录下已经有这个文件了,则可以使用 pip install -r requirements.txt
一键安装里面的依赖项。
如果没有的话,可以使用当前环境的所有包和版本生成它:pip freeze > requirements.txt
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。