函数
函数举例
- 不需要权限修饰符
- 不需要返回值类型
- 如果函数中没有return,那么默认返回值时None
# 无参函数
def test():
print("hello")
# 带参函数
def test1(n):
print("hello %d"%n)
# 求和
def jiecheng(n):
sum = 0
while n>=1:
sum += n
n -= 1
print(sum)
# 递归,阶乘
def jiecheng2(n):
if n == 1:
return 1
return n*jiecheng2(n-1)
print(jiecheng2(5))
函数参数列表中的参数类型
- 位置参数
必传参数,按照形参位置将实际值传入
def cifang(x,y):
return x ** y
print(cifang(2,3))
#可以像这样加上参数类型的提示信息,但是不按照这样传入也不会报错
def demo2(name:str,age:int):
print(name)
print(age)
demo2('zhang',12)
- 默认参数
非必传参数,调用时不填,就使用定义时的默认值
def cifang2(x,y=2):
return x ** y
#如果下面没有传入y的值,那么就默认y为2,如果传入了y值为3,则按照y=3计算
print(cifang2(3,3))
- 可变参数
非必传参数;以元组的形式存储传入的元素;不限制传入参数的个数;传入的参数类型可以是任意的;用在不知道要传入多少个参数的时候
def sum1(*args):
sum = 0
print(args,type(args))
for i in args:
sum += i
return sum
print(sum1(1,2,3,4,5))
#传入任意类型的值
def demo1(*args):
for i in args:
print(i)
demo1(12,'abc',[1,2,3,4,5])
#传入一个字典
dict1={
'firstname':'zhang',
'lastname':'ding',
'age':18
}
def testDict(*args):
for i in args:
for key,value in i.items():
print(key)
print(value)
testDict(dict1)
# 传入的字典里面有多个字典
dict2={
'person1':{
'firstname':'zhang',
'lastname':'ding',
'age':18
},
'person2':{
'firstname':'chen',
'lastname':'zhi',
'age':14
}
}
print(dict2)
def testDict2(*args):
for i in args:
for person in i.keys():
for key,value in i[person].items():
print(value)
testDict2(dict2)
- 关键字参数
非必传参数;不限制传参个数;以字典的形式保存传入的参数;因为是字典形式,所以调用函数传入实参值的时候需要以k-v格式传入
def demo3(**kwargs):
# 打印key值
for k in kwargs.keys():
print(k)
# 打印value值
for v in kwargs.values():
print(v)
# 打印key和value值
for k,v in kwargs.items():
print(k,'---',v)
demo3(name='zhang',age=12)
5. 多个参数混杂在一起的情况
def demo4(name,age=12,*args,gender):
print(name,age,args,gender)
demo4('zhang',1,2,3,gender='nan')
类
# 定义一个person类
class person(object):
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
self.hobby = 'look book' #固定的属性值
def run(self):
print('can run')
def setAge(self,age):
self.age = age
def toString(self):
print(self.name,self.age,self.gender,self.hobby)
person1 = person('zhang',12,'nan')
person1.run()
person1.toString()
person1.setAge(18)
person1.toString()
# 创建Student类,并且继承自person类
class Student(person):
def __init__(self,name,age,gender):
super(Student,self).__init__(name,age,gender)
self.friend = 'yao'
def info(self):
print(self.name,self.age,self.gender,self.friend)
student1 = Student('zhang',12,'nan')
student1.info()
异常
try:
print('start')
print(10/0)
print('end')
except ZeroDivisionError as e:
print(e)
print('请检查除数是否为0')
else:
print("如果代码没有出现异常则打印此句")
finally:
print("无论是否出现异常都会打印此句")
模块导入
包下面必须包含 init.py文件
Python源代码文件:*.py
一个py文件是一个模块(module),多个模块可以组成一个包(package)
moduleA.py文件内容为
#直接写的话会在导入的时候就执行
print('hello moduleA')
#写在main方法里面就会在模块被执行时才会执行
if __name__=='__main__':
print('hello main')
i = 10
def test():
print('test')
在这个包外面创建一个新的py文件
from pack1 import moduleA as ma
print(ma.i)
ma.test()
只打印了moduleA这一句,没有打印moduleB这一句
读写文件
读取文件内容
#读文件
f1 = open("data/cource.txt",mode='r',encoding='utf8')
# read(n) 表示读n个字符
# readline 读一行
# readlines 读所有的行 并构成list返回
print(f1.read(10))
print(f1.readline())
print(f1.readlines())
f1.close()
已经读取的数据会被忽略,之后的读取语句不会再去读取
所以readline读取的的内容不满一行,因为这一行前面的内容被read(10)读取过了
写入文件内容
#写入文件
f2 = open("data/newdata.txt",mode='w',encoding='utf8')
#写入数据时记得加上换行符号 \n
# 逐行写入
f2.write("写入的内容应该是字符串形式\n")
f2.write("否则会类型不匹配,应当是str类型\n")
f2.write("写完后记得关闭f2")
# 一次性写入多行语句
f2.writelines(['第一条数据\n','第二条数据\n','第三条数据\n','第四条数据\n'])
f2.close()
文件不存在时会自动创建
不过像上面这样每次还要手动关闭close(),有些麻烦,因此可以用with open的形式
# with open 不需要手动的关闭文件
# 读取 cource.txt的数据并写入newcource.txt
with open("data/cource.txt",mode='r',encoding='utf8') as f3:
with open("data/newcourse.txt",mode='w',encoding='utf8') as f4:
f4.writelines(f3.readlines())
从mysql中读取数据
import pymysql
# 创建连接
conn = pymysql.connect(user='root',password='123456',host='master',port=3306,database='student')
#创建游标,类似statement
cursor = conn.cursor()
#返回查询结果的总行数
t = cursor.execute("select id,name,age,gender,clazz from student where clazz like %s and gender = %s ",('理科%','男'))
print(t)
# print(cursor.fetchone()) # 返回一条记录
# print(cursor.fetchmany(3)) # 返回n条记录
# print(cursor.fetchall()) # 返回所有记录 注意使用
#打印读取出来的内容
for i in range(t):
print(cursor.fetchone())
#关闭连接
cursor.close()
conn.close()
#同样的这里也可以用 with 的形式来避免close()
with pymysql.connect(user='root',password='123456',host='master',port=3306,database='student') as conn:
with conn.cursor() as cursor:
num = cursor.execute("select id,name,age,gender,clazz from student where clazz like %s and gender = %s ",('理科%','男'))
for i in range(num):
print(cursor.fetchone())
结果跟上面一样
日期与字符串格式转换
#格式化日期字符串
from datetime import datetime
#字符串转为datetime格式
dt = datetime.strptime("2021-12-14 18:46:00", "%Y-%m-%d %H:%M:%S")
print(dt,type(dt))
print(dt.year)
print(dt.month)
print(dt.day)
#datetime格式转为字符串
#连接符 - 或者 / 都行,连接符是任意的
date_str = datetime.strftime(dt, "%Y/%m/%d %H:%M:%S")
print(date_str,type(date_str))