正文
python第一天基础1-2
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
python入门
1 第一个python代码:
在linux上创建第一个.py脚本
#!/usr/bin/env python
#-*- coding:utf-8 -*-print "Hello,World"
执行代码:
python hellp.py
2 捕获参数:
捕获参数,并存入到集合
print sys.argv
3 模块导入:
import hello
4 python编译:
经过编译 成字节码文件 .pyc文件,反编译成 .py
如果.pyc 和 .py 内容相同,则.pyc 优先级高,否则,先查找.py,再重新编译生成 .pyc 文件
5.变量:
声明变量:
name = "Hello,World"
变量命名规则:
1)变量名只能以 数字、字母、下划线组成
2)第一个字符只能为字母、下划线;不能为数字
3)不要使用内置变量名
name1 = "test1"
name1 = name2
修改 name1 = "123"
name2 的值会跟着变吗?
答案是:不变
原因很简单:变量赋值时,会在内存中申请一块内存指针空间,将test1 赋值给 name1,相当于开辟了一块内存指针空间来存放 字符串test1,同时将 name2 = name1,相当于将 name2也同样指向这块内存指针空间,如果这个时候将字符串 “123”赋值给 name1,就相当于重新在内存中开辟一块内存指针来存储字符串 “123”,而name2 指针还是第原来的内存指针空间,所以name2的值并不会随着name1的改变而变化。
字符串特性:一旦修改,重新创建
以下是分配两块地址池的:
id1 = 7
id2 = 7
id(id1),id(id2) 指针地址一样,同一块内存指针池(看起来一样,是内部进行优化的,相当于在内部循环了一遍,当循环了一遍之后,发现有一个id1也是这个地址,于是也将id2指向这个地址,实际上是开辟两块指针空间的)
如果缓冲池过大,就会新开辟一块空间,缓冲池就会将多的扔掉
id1 = 700
id2 = 700
id(id1),id(id2) 指针地址不一样
变量一般可以这样定义:
age_of_oldboy= 20 ##一般用这种
ageOf_Oldboy=20 ##驼峰定义
AGEOFOLDBOY=20###java中常量这么定义
6 流程控制:
user_name = raw_input("please enter Your name:")
if user_name == "Allen":
print "one!"
elif user_name == "yyh":
print "Two!"
elif user_name == "ali":
print "Three!"
else:
print "Invalid User!"
输入用户名和密码:
------------------------------------------
import getpass
name = input("姓名:")
pwd = getpass.getpass("密码:")
if name == "sun" and pwd == ("123"):
print ("welcome")
else:
print ("wrong username")
-------------------------猜年龄----------------------------------
age = 30
user_input = int( input("年龄:") ) ###int 将字符串转换成数字,因为字符串是不能和数字比大小的
if user_input == age:
print ("welcome")
elif user_input > age:
print ("猜小点")
else:
print ("猜大点")
------------------------------------
7.数据类型,分为两部分:数字,字符串,列表,元组,字典
1)、单值
a.数字 : 整型、长整型、浮点、复数 - (py3中已经没有长整型了)
b.布尔值: 真或假 、1 或 0 -
c.字符串: “hello wolrd”
2)、集合:
列表、元组、字典、哈希表
3)、字符串:
万恶的字符串拼接: print (r'a\ndf') r表示我写什么打印出来就是什么
python中的字符串在C语言中体现为是一个字符数组,每次创建字符串时候需要在内存中开辟一块连续的 空,并且一旦需要修改字符串的话,就需要再次开辟空间,万恶的+号每出现一次就会在内从中重新开辟一块空间。
a).字符串传值:
字符串格式化:
name = "I'm %s" % 'allen'
name = "I'm %s, age: %d" % ('allen',25) 其中%s,%d 是占位符,%s代表字符串,%d 代表数字 ,% 后面的值是实际传入的参数,用来替换%s,和%d的值 name = "I'm {0},age:{1}"
new_name = name.format('allen',25)
print new_name
利用模板去加载模板(python3中只有input这个和py2中的raw_input一样)
name = input("姓名:")
age = input("年龄:")
job = input("工作:")
hobby = input("爱好:")
info = '''
--------info of %s-------------
name:%s
age:%s
job:%s
hobby:%s
----------end------------------------
''' %(name,name,age,job,hobby)
print (info)
b) 打印字符串:
print 'name' #使用单引号
print "name" #使用双引号
print """ #使用三引号,打印多行
I'm is allen,
age is 25
"""
c) 字符串切片:
name = "allen"
name[0] #打印索引为0的值,输出值:a
name[0:2] #打印索引从0 到 2 的值,不包括2(即<),输出值为:al
name[-1] #打印最后一个,输出值:n
name[:-1] #打印索引从0开始至倒数第二个字符,不包括自己,输出值:alle
d) 统计长度
len(name) #统计字符串长度
e) 去除两边的字符
name.strip() #去除两边的空格
name.lstrip() #去除左边的空格
name.rstrip() #去除右边的空格
f) 分割
name = "allen,25,wonderful"
name.split(',')
8.列表
a) 创建列表:name_list = ['allen','yyh','ali','']name_list = list(['allen','yyh','ali',25])b) 追加name_list.append('hello')c) 删除 del name_list[0]
name.remove("sunbo")#####直接删除列表中的元素
name.pop(0)####删除下表的元素,并返回元素,如果不交o则删除列表最后一个元素
d) john (列表变成字符串) "".join(name_list) e) in (包含,判断元素是否在列表中) "allen" in name_list
f)插入
name = ["gaolong","wangyuangeng","sunlixue"]
print (name)
name.insert(1,"sunbo")
1=====是列表的索引
"sunbo"====需要插入的字符串
['gaolong', 'sunbo', 'wangyuangeng', 'sunlixue']g) 改
name = ["gaolong","wangyuangeng","sunlixue"]
print (name)
name[0]="longlong"
print(name)h)查
print (name[-3:])###获取后三个元素
print(name.index("wangyuangeng")) ###取元素的下标,如果列表中有重复的元素,只能返回第一个元素
print(name.count("sunbo")) ###返回列表中的元素个数
两个列表合并
name = ["gaolong","wangyuangeng","sunlixue","sunbo","tiansuli"]
name1=["wangxiang","shenzhaohui"]
name.extend(name1)
print(name)
列表翻转 name = ["gaolong","wangyuangeng","sunlixue","sunbo","tiansuli"]
name.reverse()
print (name)排序####py3中不能数字和字符串混这排序,会报错,但py2中没有这限制
name = ["gaolong","wangyuangeng","sunlixue","sunbo","tiansuli"]
name.sort()
print(name)深浅copy
name = ["gaolong","wangyuangeng","sunlixue","sunbo","tiansuli"]
name2=name.copy()####新数据与原数据用的不同的内存地址,原数据改变新数据不会更改,
name3=name####这种会随元数据改变而改变,而元素的复制是不会改变的,这是因为py会根据数据量的大小去判断需不需要重新开一个新的内存改存放数据
print ( name2,id(name),id(name2))
print ( name3,id(name),id(name3))
name.pop()
print("-----print-----")
print ( name2,id(name),id(name2))
print ( name3,id(name),id(name3))
['gaolong', 'wangyuangeng', 'sunlixue', 'sunbo', 'tiansuli'] 4731608 4731648
['gaolong', 'wangyuangeng', 'sunlixue', 'sunbo', 'tiansuli'] 4731608 4731608
-----print-----
['gaolong', 'wangyuangeng', 'sunlixue', 'sunbo', 'tiansuli'] 4731608 4731648
['gaolong', 'wangyuangeng', 'sunlixue', 'sunbo'] 4731608 4731608
9.元组 (没有增删改),其他和列表一样
("allen","ali","yyh")
总结:
列表(list),字符串(str),元组(tuple)
共同点:
切片、索引、len() 、in
不同点:
str:重新开辟空间
list:修改后,不变
元组(tuple):
不允许修改
10.for 循环:
name_list = ['allen','yyh','ali','']for item in name_list: if item == "yyh": print "diu diu ..." continue if item == "ali": print "welcome to here!" break # 跳出循环
猜年龄,3次退出# -*- coding: utf-8 -*-
age = 20
for i in range(3):
guess_age= int(input("输入年龄:"))
if age == guess_age:
print ("correct")
#break
elif age > guess_age:
print ("try bigger")
else:
print ("try smaller")else:###如果for循环正常结束,就执行else下的语句
exit("退出")
需求一:还是上面的程序,但是遇到小于5的循环次数就不走了,直接跳入下一次循环
1 2 3 4 | for i in range ( 10 ): if i< 5 : continue #不往下走了,直接进入下一次loop(跳出当前循环,继续下一次循环,只跳一层) print ( "loop:" , i ) |
需求二:还是上面的程序,但是遇到大于5的循环次数就不走了,直接退出
1 2 3 4 | for i in range ( 10 ): if i> 5 : break #不往下走了,直接跳出整个loop(跳出整个当前层循环) print ( "loop:" , i ) |
11.while 循环:
while 条件:
print "ok ok ok"
while True: # 死循环
print 'true'flag = True #标记位
while flag: print "ok ok ok"
flag = False
有一种循环叫死循环,一经触发,就运行个天荒地老、海枯石烂。
海枯石烂代码
1 2 3 4 5 | count = 0 while True : print ( "你是风儿我是沙,缠缠绵绵到天涯..." ,count) count + = 1 |
其实除了时间,没有什么是永恒的,死loop还是少写为好
上面的代码循环100次就退出吧
1 2 3 4 5 6 7 8 | count = 0 while True : print ( "你是风儿我是沙,缠缠绵绵到天涯..." ,count) count + = 1 if count = = 100 : print ( "去你妈的风和沙,你们这些脱了裤子是人,穿上裤子是鬼的臭男人.." ) break |
回到上面for 循环的例子,如何实现让用户不断的猜年龄,但只给最多3次机会,再猜不对就退出程序。
第一种方法
# -*- coding: utf-8 -*-
count = 0
longlong_age=50
while count<5:
guess_age=input("请输入高龙年龄:")###输入的都是字符串格式
if guess_age.isdigit():###通过字符串内置方法,判断是不是数字
guess_age=int(guess_age)###如果不是数字,就用int方法转换为数字
else:
continue###否则,不是数字的(字符串,和空格等)则退出本次循环,
if guess_age==longlong_age:
print ("你才对了")
break
elif guess_age>longlong_age:
print("你才的太小了")
else:
print("你猜的太大了")
count+=1
else:
print("太笨了,猜了这么多次,还没猜对")
第二种方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #!/usr/bin/env python # -*- coding: utf-8 -*- my_age = 28 count = 0 while count < 3 : user_input = int ( input ( "input your guess num:" )) if user_input = = my_age: print ( "Congratulations, you got it !" ) break elif user_input < my_age: print ( "Oops,think bigger!" ) else : print ( "think smaller!" ) count + = 1 #每次loop 计数器+1 else : print ( "猜这么多次都不对,你个笨蛋." ) |
12.字典,键值对 (字典无序,特殊的for循环)
person = {
"name":"allen",
"age":"",
"gender":"man",
}#person['name']
for k,v in person.items(): #字典无序
print k,v person.keys() #所有key
person.values() #所有value
person.items() #所有元素
13.运算符
a) 算数运算:+ - * / % ** //
b) 比较运算:== != < > >= <=
c) 赋值运算:= += -= *= /= %= **/ //=
d) 逻辑运算:and or not
e) 成员运算:in not in
f) 身份运算:is is not
g) 位运算:& | ^ ~ >> <<
14.文件操作:
file_list = open('filename.txt','r')orfile_list = file('filename.txt','r')for line in file_list.read():
print line # 全量读for line in file_list.readlines():
print line # 读取所有行,(列表)for line in file_list.xreadlines():
print line # 一行一行读(每次只读一行)
需求:将用户每登陆一次,记录一次登陆次数(通过操作文件实现)
log.txt文件内容格式如下:
sun;123;3
bo;123;4
#!/usr/bin/env python
#-*- coding:utf-8 -*-
file_obj = file('test.txt','r+')
line_list = file_obj.readlines()
my_list = []
for ele in line_list:
line = ele.strip()
value_list = line.split(';')
last_value = int(value_list[-1])
last_value += 1
value_list[-1] = str(last_value)
value_str = ';'.join(value_list)
my_list.append(value_str)
file_obj.seek(0)
my_str = '\n'.join(my_list)
file_obj.write(my_str)
file_obj.close()