python筆記12

day12面試

今日內容閉包

  • 函數中高級(閉包/高階函數)
  • 內置函數
  • 內置模塊(.py文件)

內容回顧app

  • 函數基礎概念
    • 函數基本結構
      def func(arg):
      return arg;
      v1 = func(123)
    • 參數
      • 寫函數
        • def func(a1,a2):pass
        • def func(a1,a2=None):pass
        • def func(*args,**kwargs):pass
      • 執行函數
        • 位置參數在前/關鍵字參數在後。
  • 函數小高級
    • 函數能夠作變量
      def func():
      pass
      v1 = func
      v1()dom

      v2 = [func,func,func]
      v2[1]()
    • 函數能夠作參數
      def func(arg):
      v2 = arg()函數

      def show():
          pass
      
      v1 = func(show)
      # 注意返回值
    • Python中以函數爲做用域
      # 第一題
      for item in range(10):
      pass
      print(item)編碼

      # 第二題
      item = 10
      def func():
          for item in range(10):
              pass 
          print(item)
      func()
      
      # 第三題
      item = 10
      def func():
          item = 2
          def inner():
              print(item)
          for item in range(10):
              pass 
          inner()
      func()
      
      # 第四題【新浪微博】
      def func():
          for num in range(10):
              pass
          v4 = [lambda :num+10,lambda :num+100,lambda :num+100,]
          result1 = v4[1]()
          result2 = v4[2]()
          print(result1,result2)
      func()
      
      # 第五題【新浪微博】
      def func():
          for num in range(10):
              pass
          v4 = [lambda :num+10,lambda :num+100,lambda :num+100,]
          result1 = v4[1]()
          num = 73
          result2 = v4[2]()
          print(result1,result2)
      func()
    • lambda表達式(匿名函數)
      v = [lambda x:x=100,]加密

    • 內置
      • 輸入輸出
        • print
        • input
      • 強制轉換
        • int
        • bool
        • str
        • list
        • tuple
        • dict
        • set
      • 數學相關
        • max
        • min
        • sum
        • abs
        • divmod
        • float
        • pow
          v = pow(2,3)
          print(v)#8
          #冪次方計算
        • round
          v = round(1.127,2)
          print(v)#1.13
          #保留小數位數
      • 進制
        • bin
        • oct
        • int
        • hex
      • 其餘
        • len
        • range
        • id
        • type
        • open

補充code

  1. 數據類型中的方法到底有沒有返回值?
    • 無返回值
      v = [11,22,33]
      v.append(99) # 無返回值
    • 僅有返回值:
      v = "alex"
      result = v.split('l')對象

      v = {'k1':'v2'}
      result1 = v.get('k1')
      result2 = v.keys()
    • 有返回+修改數據
      v = [11,22,33]
      result = v.pop()
    • 經常使用須要記住
      • str
        • strip,返回字符串
        • split,返回列表
        • replace,返回字符串
        • join,返回字符串。
      • list
        • append,無
        • insert,無
        • pop,返回要刪除的數據
        • remove,無
        • find/index,返回索引的位置。
      • dict
        • get
        • keys
        • values
        • items
  2. 函數內部的數據是否會混亂。
    • 函數內部執行相互之間不會混亂
    • 執行完畢 + 內部元素不被其餘人使用 => 銷燬

內容詳細索引

  1. 函數中高級

1.1 函數能夠作返回值

def func():
    print(123)

def bar():
    return func

v = bar()

v()

name = 'oldboy'
def func():
    print(name)
    
def bar():
    return func

v = bar()

v()

def bar():
    def inner():
        print(123)
    return inner
v = bar()
v()

name = 'oldboy'
def bar():
    name = 'alex'
    def inner():
        print(name)
    return inner
v = bar()
v()

name = 'oldboy'
def bar(name):
    def inner():
        print(name)
    return inner
v1 = bar('alex') # { name=alex, inner }  # 閉包,爲函數建立一塊區域(內部變量供本身使用),爲他之後執行提供數據。
v2 = bar('eric') # { name=eric, inner }
v1()
v2()

練習題

# 第一題
name = 'alex'
def base():
    print(name)

def func():
    name = 'eric'
    base()

func() # {name=eric, }
    

# 第二題
name = 'alex'

def func():
    name = 'eric'
    def base():
        print(name)
    base()
func()

# 第三題
name = 'alex'

def func():
    name = 'eric'
    def base():
        print(name)
    return base 
base = func()
base()

注意:函數在什麼時候被誰建立?

面試題

info = []

def func():
    print(item)
    
for item in range(10):
    info.append(func)

info[0]()

info = []

def func(i):
    def inner():
        print(i)
    return inner

for item in range(10):
    info.append(func(item))

info[0]()
info[1]()
info[4]()
0
1
4

1.2 閉包

def func(name):
    def inner():
        print(name)
    return inner 

v1 = func('alex')
v1()
v2 = func('eric')
v2()

1.3 高階函數

  • 把函數看成參數傳遞
  • 把函數看成返回值

注意:對函數進行賦值

1.4 總結

  • 函數執行的流程分析(函數究竟是誰建立的?)
  • 閉包概念:爲函數建立一塊區域併爲其維護本身數據,之後執行時方便調用。【應用場景:裝飾器 / SQLAlchemy源碼】
  1. 內置函數
  • 編碼相關
    • chr,將十進制數字轉換成 unicode 編碼中的對應字符串。
      v = chr(99)
      print(v)
    • ord,根據字符在unicode編碼中找到其對應的十進制。
      num = ord('中')
      #20013
    • 應用:
      import random

      def get_random_code(length=6):
          data = []
          for i in range(length):
              v = random.randint(65,90)
              data.append(chr(v))
      
          return  ''.join(data)
      
      
      code = get_random_code()
      print(code)
      import random # 導入一個模塊 
      
      v = random.randint(起始,終止) # 獲得一個隨機數
  • 高級一點的內置函數
    • map,循環每一個元素(第二個參數),而後讓每一個元素執行函數(第一個參數),將每一個函數執行的結果保存到新的列表中,並返回。
      v1 = [11,22,33,44]
      result = map(lambda x:x+100,v1)
      print(list(result)) # py3中特殊,result是一個對象。經過list提取值。
    • filter
      v1 = [11,22,33,'asd',44,'xf']

      def func(x):#過濾條件,真假表示。
          if type(x) == int:
              return True
          return False
      result = filter(func,v1) # [11,]
      print(list(result))
      
      
      result = filter(lambda x: True if type(x) == int else False ,v1)
      print(list(result))
      
      result = filter(lambda x: type(x) == int ,v1)
      print(list(result))
    • reduce
      import functools
      v1 = ['wo','hao','e']

      def func(x,y):
          return x+y
      result = functools.reduce(func,v1) 
      print(result)
      
      result = functools.reduce(lambda x,y:x+y,v1)
      print(result)
  • 面試題:
    • 經常使用的內置函數有哪些?
    • filter/map/reduce是什麼意思?
    • 什麼是匿名函數?(lambda表達式)
      def func():
      pass

      v = [lambda x:x+100,]
  1. 模塊

將指定的 「字符串」 進行加密。

import hashlib

def get_md5(data):
    obj = hashlib.md5()
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result

val = get_md5('123')
print(val)

加鹽(防止MD5撞庫解密)

import hashlib

def get_md5(data):
    obj = hashlib.md5("sidrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))#加鹽
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result

val = get_md5('123')
print(val)

應用:

import hashlib
USER_LIST = []
def get_md5(data):
    obj = hashlib.md5("12:;idrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result


def register():
    print('**************用戶註冊**************')
    while True:
        user = input('請輸入用戶名:')
        if user == 'N':
            return
        pwd = input('請輸入密碼:')
        temp = {'username':user,'password':get_md5(pwd)}
        USER_LIST.append(temp)

def login():
    print('**************用戶登錄**************')
    user = input('請輸入用戶名:')
    pwd = input('請輸入密碼:')

    for item in USER_LIST:
        if item['username'] == user and item['password'] == get_md5(pwd):
            return True


register()
result = login()
if result:
    print('登錄成功')
else:
    print('登錄失敗')

贈送:密碼不顯示(只能在終端運行)

import getpass

pwd = getpass.getpass('請輸入密碼:')
if pwd == '123':
    print('輸入正確')

總結

  • 自定義函數
    • 基本函數結構(98%)
    • 高級
      • 參數
      • 閉包
  • 內置函數
  • 模塊
    • random
    • hashlib
    • getpass
相關文章
相關標籤/搜索