20210619 start
接下来
找一个合适的小白辅助教材
复习内容
牛客网
函数
定义函数
def 函数名():
具体干啥
def 函数名(): ————带返回值的函数
具体干啥
return 返回值——注意这里返回值是没有括号的,而且是缩进了。
案例 输出一个计算式(-8+22)×a-10+c÷2的结果,a=40,c=212 比如
思路20210618 复习到定义函数 突然想起来 这其实是个函数调用题
代码
def jisuan(a,c):
s=(-8+22)*a-10+c/2
return int(s)
s=jisuan(40,212)
print(s)
思路 以前——想直接用print 打出结果,但是不知道print复杂语法
网友代码
a=40
c=212
print(eval('(-8+22)*a-10+c//2') )——eval里是否加括号和''?
收获
print( eval(' 计算式'))
变量作用域问题
全局变量
代码1
def test():
print (string)
string = '小象学院'
test()
结果1
小象学院
代码2
def test():
print (string)
test()
string = '小象学院'
结果2
报错 NameError: name 'string' is not defined
代码3
string = '小象学院'
def test():
print (string)
test()
结果3
小象学院
初步结论
在函数外定义的变量,只要在函数最终调用前 定义,都能被函数调用。——
但是 如果不小心定义了和函数里一样的 变量名,那岂不是很糟糕?
——因为不是说函数 会封装好吗? 那外部的变量名 和函数里的名称 碰巧一样,不是冲突了吗
初步结论的解决——调用的时候,如果全局变量和内部变量名称冲突,还是优先内部变量(或者说内部变量的优先级高>于全局变量,内部函数调用还是先看内部赋值)
代码4
string='外部全局'
def t():
string='函数内部变量'
print(string)
t()
print(string)
结果4—— 也就是调用的时候,如果全局变量和内部变量名称冲突,还是优先内部变量
函数内部变量
外部全局
!!外部全局变量 global 变量名
代码5
string='外部全局'
def t():
string='函数内部变量'
print(string)
t()
print(string)
def pt():
global string————————声明了global变量之后,前面的全局变量才失效
string='lize test'
print(string)
pt()
print(string)
结果5
函数内部变量
外部全局
lize test
lize test
py自带函数——内建函数(官网)https://docs.python.org/zh-cn/3/library/functions.html
sorted() ——list2=sorted(list1)——从低到高
max()
min()
都是有返回值的这几个
函数练习
case1 累加和——到某个end为止
很久以前的思路—— for自带自动+1
def calculate_sum(number):
a = 0
for i in range(number+1):
a = a + i
return a
# 补充以下四行代码,分别求100以内的累加和和200以内的累加和,并分别打印出。
print(calculate_sum(100))
print(calculate_sum(200))
20210619思路——while 配合计数器
def sumjia(a):
s=0
i=1
while i <=a:
s=s+i
i=i+1
return s
end=int(input('end num is\n'))
print(sumjia(end))
case2 low到high几位数,没有重复的3位数
20210619思路——三层(因为三位数)循环遍历——注意跳出
def thr(low,high):
for i in range(low,high+1):
for j in range(low,high+1):
for k in range(low,high+1):
while i!=j and i!=k and j!=k:
print(i*100+j*10+k)
break——break跳出很重要,continue还不行?为啥,不是特别懂
thr(2,5)
case3 在范围内猜数字
20210617思路——不断逼近——break用法强化理解
def guess(right,a,b):
while True:
print('num is {} to {}'.format(a,b))
youinp=int(input('now guess\n'))
if youinp==right:
print('bingo!!!')
break—— break这里直接从while True跳出去了
elif youinp<right:
a=youinp
break——这里就不能break,条件到这就直接退出if判断(else那同理)
else:
b=youinp
guess(9,1,100)
case4 打印n*n 乘法表
20210619思路——两层循环,难点在于 空格和换行(怎么纵向一直对齐呢?)end='\t'
def cheng(n):
for i in range(1,n+1):
for j in range(i,n+1):
print('{}*{}={}'.format(i,j,i*j),end=' ') ——end='\t' 一个占位符大概4个空格
print('\n')
cheng(int(input('num\n')))
case5 任意区间内素数
思路20210619——除了本身及1外,若可整除,计数器+1,计数器=2的数才是素数,打印,否则略过且计数器清零
代码
def sushu(low,high):
c=0
global b
b=0 #用来计有几个素数
for i in range(low,high+1):
for j in range(1,i+1):
if i%j==0:
c=c+1
if c==2:
print(i)
c=0
b=b+1
else: ——否则计数器清零也非常重要
c=0
return b
sushu(3,100)
print('有{}个素数'.format(b)) ——b变成 全局变量才能print,不然无法调用——但没有利用函数返回值,其实是利用 全局变量
sushu(5,299)
print('有{}个素数'.format(b))
hanshujieguo=sushu(3,100)
print('有{}个素数'.format(hanshujieguo)) #利用函数返回值输出
参考答案思路——也很巧妙——通过改flag状态(比我的节约资源)
代码
def find(low,high):
for i in range(low,high+1):
flag='yes'
for j in range(2,i):
if i%j==0:
flag='no'
break
if flag=='yes':
print(i)
find(1,100)
案例——输入用户名&密码,符合条件才存储密码
思路20210619——用三个函数,分别检查空用户名、检查密码尺寸、检查是否存储
代码——用到了global 声明全局函数,不然最后的save函数存储不了局部——不是的——不做global全局声明也可以,写在要使用的函数前面即可。
函数定义内的 局部函数,以局部优先。
具体代码
global a ——可省略
a=input('username\n')
global b——可省略
b=input('pw\n')
def uncheck(a):
#global a
if a=="":
return False
else:
return True
def namecheck(b):
#global b
if len(b)<6:
return False
else:
return True
def save(c,d):
#c=namecheck(a)
#d=uncheck(b)
dict={}
if c and d:
print('okd')
dict[a]=b
else:
print('bukeyide')
print(dict)
cinput=uncheck(a)
dinput=namecheck(b)
save(cinput,dinput)
参考答案思路——在最后save函数中 调用前面函数(在局部函数中可以调用其他局部函数咯?)
代码
# 检测用户名是否符合要求的函数
def uncheck(username):
if len(username) == 0:
return False
else:
return True
# 检测密码是否符合要求的函数
def pwcheck(password):
if len(password) >= 6:
return True
else:
return False
# 第三步 保存函数
def save(username, password):
# 用户名和密码都通过检测
if uncheck(username) == True and pwcheck(password) == True: ——调用其他两个函数
accounts[username] = password
print("账号创建成功!")
# 用户名或密码未通过检测
else:
print("账号创建失败。")
# 创建一个空字典用来保存用户名和密码
accounts = {}
# 现在试着保存三个账户名和密码
for i in range(3):
username = input("请输入用户名:")
password = input("请输入密码:")
save(username, password) ——调用其他两个函数
20210619 end
今日收获
后面健身去了没有继续
又对 变量(全局、局部、global)有了深刻的认识
代码撰写感觉比以前更加轻松了,也对案例有了更多自己的理解和思路。写起代码来也有点轻车熟路了,很多之前不太明白的内容,现在理解稍微深一些了。
常学常新
接下来
挑一挑入门书——20号看了豆瓣上的一些推荐
《python的入门到实战》这本基本和小象学院讲的这套一致,所以倒也不必买了。
《笨方法学python》是obe的教学思路,都是题,如果有钱还可以再买来巩固。——也可以牛客网等现成网站上刷一刷题。
以前觉得小象学院的内容讲得浅,但现在回过头来看一下就也还好。比较全了,其实跳出来看也比较成体系了。巩固几遍理论上说是可以去做实战项目了,可能库这块还不多?不知道是不是我还没涉及(目前只看到异常处理这)
刚才打完字右手中指在不自觉地抖动,观察了一会。看来还是要保护一下颈椎和腰椎,学习的路还很长,身体是革命的本钱。
既然没有更好的推荐,小象学院的课继续往下看下去吧~
网友评论