-
目录
vi helloworld.py - 编辑
- python3 helloworld.py
- 注意保存代码的时候,一定需要utf-8格式保存,python3支持utf-8编码
美国的技术是最新的,一般经过四五年才会引入到国内的一线城市,再过两三年才会引入到国内的其他省会城市。留学者学到的新技术,回国后乘着国内还没有的时候最容易发展起来。
交互模式:
输入python3 ,如果有个知识点你不会,可以用交互模式实验,输入exit() 可以退出。
help(函数名) 切记不要带括号,查看函数的文档说明,只要是函数就可以,不论是系统自带还是自己定义的。不过自己定义的函数必须在函数内部用多行注释在第一行代码写清功能说明,这样才能用help()显示出来。
def function():
"""这个函数用了完成xxx功能的"""
print("测试函数")
ipython3:支持命令
建议能用python的地方用ipython,能用python3的地方用ipython3
0x01.注释:
#单行注释
‘’‘多行注释’‘’
“”“多行注释”“” ,如果在print内则表示保留换行符号输出
python2中如果含有中文,必须在首行加上 #coding=utf-8 或者 #-*- coding:utf-8 -*- ,后者更加正规,告诉解释器中文用utf-8编码。
0x02.变量以及类型
查看所有关键字:
import keyword
print(keyword.kwlist)
score = 100
#变量名 = 值
多行语句归并为一行,需要用分号分割:最后一个语句不需要
num1=1;num2=2;num3=3;print(123)
0x03.输入和输出
#输入:
输入数据默认为字符串类型:
height = input("input your height:")#python3中输入的任何东西都会作为字符串存储
print("your height is %s"%height)
通过int(),float()或者eval()可以转化为数字类型(推荐使用int()和float eval()本来就是任意代码执行函数,用这个太危险)
注意:
int型的字符串例如"45"可以通过int()强转为int型的45
float型的字符串例如"45.5" 不能通过int()强转为45,只能先通过float转化为45.5,然后通过int强转float为int
如果不能确定数据类型,就直接用eval吧
num=input('input:')
print(type(num)) #str
num=int(num)
print(num)
print(type(num))#int
例如:圆面积的计算:
R=int(input('R:'))
print(R*R*3.14)
如果输入的数字用','分隔,eval转化后为一个元组类型:
import math
RL=eval(input("enter the radius and length:"))#12,13
radius,length=RL #(12,13)
area=(radius**2)*math.pi
volume=area * length
print("The area is {}".format(area))
print("The volume is {}".format(volume))
#python2中的raw_input("please input:")效果和python3中的效果完全相同
#python2 input输入的任何数据都是代码,等价于 a = 你输入的代码
a=input("请输入")
#输出:
一次输出多个:
name = "laowang"
age = 20
addr = "shandong"
print("name:%s age:%d address:%s"%(name,age,addr))
print(age) #print("%d"%age)
print(“*”) #打印是自动换行的,如果想取消自动换行,这样写:print("*",end ="")
print("""
hello world
hello world
hello world
""")
#将保留换行符号原样输出。
如果要打印很长的一行数据,但是写在一行又太挤了,可以用\可以链接多行形成一行:
print("你这个逼装的湿润\
圆滑 有弹性有深度,有湿度,\
尽管 你这个逼虽然装的很华丽,\
但是少了那么一丝朴实,没有给我焕然一新的感觉\
,如果再加入那么一丝朴实的话,\
这个逼就无人能挡了,我希望在国际装\
逼总决赛的舞台上,能看到焕然一新的你,所以我给你YES!")
注意:python语法上是严格区分大小的写,所以木马的大小写绕过就不要想了。
例如像Print()这样的,就不可以运行。
0x04数据类型:
定名常量:定名常量只是一种规范,实际上是变量。
PI=3.1415
type(变量名) 返回变量的类型
id(变量名) 返回变量的内存地址
python(弱类型语言)变量可以改变数据类型 的原理:
num1=123
num1="hello world"
num1=123.3
python的变量赋值是”地址赋值“ 而不是 ”内容赋值“
即只是将数据在内存中的地址赋值给变量名。
例如:str1和str2存储其实是同一个内存地址。
str1="hello world"
str2="hello world"
print(id(str1),id(str2))
变量连续赋值:
num1=num2=10
变量交互赋值:(左右必须一一对应,不能多写也不能少写)
num1,num2=1,2 #等价于num1=1,num2=2
print(num1,num2)
#None
主要用于标记一个变量当前有没有被赋值。
例如,我们想声明一个变量,但是不想马上给它赋值的情况下,就可以先给这个变量赋值为None。
num=None
print(num)
print(type(None))
#数字
##复数(complex):之后做高级项目需要用
主要用于表示坐标系中的坐标
data=1+2j
print(data)
print(type(data))
'''
(1+2j)
<class 'complex'>
'''
del删除变量,删除变量后不能再引用变量
data=1+2j
print(data)
print(type(data))
del data
print(data) #报错
round()四舍五入
math库
import math
print(abs(-5)) #求绝对值
print(max(1,2,10))
print(min(1,2,10,101,111))
print(pow(2,4)) #相当于 2**4
print(math.sqrt(9)) #相当于 2**0.5
print(math.sin(3.14))
如何快速查看帮助:
交互模式下:
dir(math) 快速查看math包中有哪些函数
help(math.pow)显示帮助
#字符串:字符串和元组都是不可变类型。
python没有char类型,只有str类型
ord() 字符转ascii码,输入的字符串的长度只能为1
chr() ascii码转字符
c='A'
print(ord(c)) #65
cc=65
print(chr(cc)) #A
如果输入的是汉字,默认会转化为unicode码
c='你'
print(ord(c))
cc=20320
print(chr(cc))
实现简单的加解密:
decode='hello world'
def encFunc(decode):
encode=''
for c in decode:
encode+=chr(ord(c)+2)
return encode
def decFunc(encode):
decode=''
for c in encode:
decode+=chr(ord(c)-2)
return decode
print(encFunc(decode))
print(decFunc(encFunc(decode)))
##1.len
len(字符串) 返回一个字符串的长度,python3中默认采用utf-8编码格式,不论汉字,还是英文字母,在统计字符串长度时都按一个字符对待和处理。
例如:
len("西电")
返回值为2。这和C中是完全不同,C中strlen在计算英文字母一个字母是一个字符,而在计算汉字时,一个汉字相当于3个字符。不计算末尾的\0;
##2.字符串的留驻机制:
- Python字符串驻留机制:对于短字符串,将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享该副本。长字符串不遵守驻留机制。
- 由数字、字母、下划线组成的字符串,触发驻留机制。
##3.字符串格式化
方法1:%法
和C的格式化输出类似
str = “名字:%s,学号:%d”%(“小明”,180302)
但是也有一些区别:
'%s'%([1,2,3]) #可以直接把列表转化为字符串 '[1,2,3]'
#等价的实现方法
str([1,2,3])#直接强制类型转化
这里其实也有一个坑,有人想当然的以为,如果将一个列表先强制转化为字符串,然后再将这个字符串强制转化为一个列表,那么仍然会是原来列表,然而事实是这样的:
顺便提一下非常重要的eval()函数!!
eval(字符串) 函数会将字符串参数当做代码来执行,并返回代码的执行结果
方法2:format方法
字符串拼接的两种方式:
a = "lao"
b = "wang"
e = "===" + a + b + "==="
f = "===%s==="%(a+b)
字符串切片:
name = "laowang"
print(name[2:-1:2]) #最后一个参数表示步长
#[起始位置:终止位置:步长] 步长如果省略默认为1
字符串逆序:
name = "shangrui"
print(name[-1::-1])#注意:name[-1:0:-1]达不到这个效果,因为0取不到
print(name[::-1])#可以达到同样的效果,省略起始位置和终止位置 的意义取决于步长,如果步长为正,那么就表示从头取到尾,如果步长为负,就表示从尾取到头
字符串的常见操作:
语言是一通百通,你学通了一门语言后,怎么学下一门语言呢?老师学通了C++,老大给了老师一个项目,老师知道python能干出来,有一个方向,例如判断,老师知道C++中用if,然后python中是不是也用呢?OK查一下。然后,就这样从下午8点研究到晚上2点,所有的功能都实现了,python也学完了。
在IPython3 交互模式下,如果一个变量是字符串,例如 name变量是一个字符串,那么 输入name. 然后按tab键就可以知道 字符串的所有操作,不要刻意去记,知道一个方向,需要的时候去查。
- name.find("子串") 从左向右开始找,找到了第一个匹配的子串,则返回下标,找不到返回-1
- name.rfind("子串")从右向左开始找
- name.index("子串") 和 find的唯一区别:找不到时直接程序产生一个错误。
- name.rindex("子串")
- name.count("子串") 返回子串出现的个数
- name.replace("子串",“替换”,[替换的次数]) :常用于爬虫数据的清理
- name.split("按照什么切") 返回值为一个列表 :可以用来统计所有单词的个数
- name.split() 默认按照空白字符(空格,制表符,换行符)进行切割
#例如给你一个列表,让你去除其中的\n\t以及空格得到一个新字符串,应该怎么做 test= "asdda sdad \n\tdsds\t \t dsad" new_test = "".join(test.split())
- name.capitalize() 将一句话的第一个字母大写
- name.title() 将字符串的每个单词的首字母大写
- name.startswith("xxx") 判断字符串是不是以xxx开头
- name.endswith(".jpg") 判断字符串是不是以.jpg结尾。
- name.lower()
- name.upper()
- name.rjust(宽度) :靠右对齐
- name.center(宽度) : 居中对齐
- name.lstrip():删除left的空格
- name.rstrip():删除右边的空格
- name.strip():删除两边的空格
- name.partition("字符串") : 从左向右找,返回一个元组
- name.rpartition("xxx"):从右向左
- name.splitlines():按照换行进行分割
- name.isalpha():判断字符串是不是全部由字母组成
- name.isdigit():判断字符串是不是全部由数字组成
- name.isalnum():判断字符串是不是由字母和数字组成
- name.ispace():判断字符串是不是全部由空格组成
列表:可以同时存储多个不同类型的变量
增:
列表.append(元素)
列表.insert(位置,元素)
列表1.extend(列表2) 将列表2添加到列表1中
注意:python中的列表和C++中的数组十分相似,C++中数组增可以用 数组名[索引] = 值 的方式,但是在python不可以用这种方式来增加元素,这种方式只能修改已有元素。
删除:
列表.pop()
列表.remove(内容)
del 列表[下标]
改:
列表[下标] = 值
查询:
if 元素 in 列表:
if 元素 not in 列表:
元组:增删改都不行,只能查
a = (11,22)
b = a #b=(11,22)
c,d = a #c=11 d =22 相当于拆包
字典:
info ={键:值,键:值,键:值}
存储过程:首先将键哈希,然后将值存储到哈希值对应的地址上去。键 可以是任何不可变的类型,可变类型不可以作为 键
字典的增删改查:
字典[key] = value ,key 如果存在,就是修改,key如果不存在,就是添加。
删除:del 字典[键]
查询:
法1:字典[键],如果存在,就返回值,如果不存在,则报错
法2:字典.get("键"),如果存在,返回值,如果不存在,也不报错
字典的常用操作:
len(字典) ,返回字典中键值对的个数
字典.keys(),返回字典中由键组成的列表(python2),python3中返回的是一个对象
字典.values(), 返回字典中由值组成的列表(Python2),python3中返回的是一个对象
字典.items(),返回字典中由键值对(元组)组成的列表(python2)
infor = {"name":"laowang","age" = 22}
for name,age in infor.items():
print("name:%s,age:%s"%(name,age))
3.流程控制
age = input("age:")
age_num = int(age) #强制类型转换
if age_num > 18:
print("Adult!")
else:
print("Child!")
age = 10
if age > 19:
print("00000")
print("00000") #通过缩进来区分if语句块
print("00000")
if 条件1:
xxx
elif 条件2:
xxx
else:
xxxx
循环:
while 条件:
语句块1
name = "laowang"
for temp in name:#将name变量中的每个字母逐个赋值给temp变量
print(temp)
nums = [1,2,3,4]
for temp in nums:
print(temp)
else:
print("=====") #当遍历完整个列表后就会执行该语句
nums = [1,2,3,4]
for temp in nums:
print(temp)
break; //只会输入1,并且不会执行else语句,跳出了整个循环
else:
print("=====") #当遍历完整个列表后就会执行该语句
4.运算符
a / b :取真实结果
a//b :整除,整数整除整数,结果一定是整数,浮点数整除整数,结果仍然是浮点数
a%b: 取余
2**10 :2的10次方
2**0.5 :求平方根
”sorry“*10:字符串重复10次拼接起来
逻辑运算符:or and not()
ctrl+n 变量名补全
例如:程序11行出错了可以 vi 程序名 +11 直接跳转到11行
a*=34-33 相当于 a=a*(34-33)
运算符换行不影响:
print(1+2+3+1+2+3
+1+2+3+1+2+3
+1+2+3+1+2+3)
科学计数法:
data=1.5e3 # 1.5*10^3
print(data)
data=1.5e-4 # 1.5*10^(-4)
print(data)
5.函数
def 函数名(参数):
xxxxxx
xxxxxx
一个函数返回多个值,不能用多个return来实现,需要先封装,再用一个return返回。
def test():
a=11
b=22
c=33
#第一种,用一个列表来封装3个变量的值
#d = [a,b,c]
#return d
#第二种,
#return [a,b,c]
#第三种
#return (a,b,c)
#return a,b,c 默认返回一个元组
函数的缺省参数
def test(a,b=2):#表示第二个参数的缺省参数是2,注意缺省参数必须排在参数列表的最后边,不能写成def test(b=2,a)
result = a+b
print(result)
test(11,22)#33
test(33) #35
实参在赋值给形参的时候,可以指定给赋值给哪个形参
def test(a,b=22,c=33):
print(a+b+c)
test(11,c=33) #a=11 b = 22 c = 33
#c = 33 称为 命名参数
不定长参数:加上*的形参名(必须放在形参的最后)。*告诉解释器特殊照顾下这个形参,把长余的变量封装成元组赋值给它
def sum_2_nums(a,b,*args):
print(a)
print(b)
print(c)
sum_2_nums(11,22,33,44,55)
#11
#22
#(33,44,55)
def test(a,b,c=33,*args,**kwargs):
print(a)
print(b)
print(c)
print(args)
print(kwargs)
test(11,22,33,44,55)
"""
11
22
33
(44,55)
{}
"""
test(11,22,33,aim=99,finish=89)
"""
11
22
33
()
{aim:99,finish:89}
"""
A = (44,55,66)
B = {"name":"laowang","pwd":213}
test(11,22,33,*A,**B)
#实参中*和**表示拆包,*表示将元组拆成一个一个的值,**表示将字典拆成一个一个键值对
长余的命名参数全部封装成字典赋值给**之后的变量,长余的非命名参数分装成元组赋值给*之后的变量
6.局部变量和全局变量
temperature = 0
def change_temperature():
temperature = 33 #实际上重新定义了一个局部变量,同名的局部变量会覆盖全局变量
def print_temperature():
print(temperature)
def real_change_temperature():
global temperature = 33 #使用global说明变量是之前定义的全局变量。
#也可以这样写
def real_change_temperature():
global temperature
temperature =33 #这样下面遇到temperature就认为是指的是全局变量。
change_temperature()
print_temperature() #0 ,因为change函数中的temperature只不过是一个和全局变量的同名的局部变量而已,在函数内部,局部变量会覆盖全局变量
real_change_temperature()
print_temperature() #33
全局变量定义的注意点:
a = 100
def test():
print(a)
print(b)
print(c)
b = 200
test()
c = 300 #print(c) 时报错
列表作为全局变量:
nums = [11,22,33]
def test():
for num in nums:#注意这里并不是重新定义一个局部变量,所以不存在局部同名变量覆盖的问题
print(num)
nums.append(44)
print(nums)
test()
引用:
#python中变量的存储过程与c++不同
a = 100 #先开辟一段内存空间存储100,然后将内存空间的地址赋值给a。而不是将内存空间命名为a
b = a #表示将内存空间的地址赋值给b,所以a和b 指向的是同一段内存空间。
id(b) #显示变量指向的内存空间地址
id(a)